忙了 好久 有时间来整理下最近的知识了 首先封装LDAP的方法 让他可以已实体的方式来进行操作,思路类似于JPA 传入传出最好是实体 在实体里 使用map当作注解映射。下面 先上2个代码
第一个封装一个baseDao;
import java.util.HashMap; import java.util.List; import java.util.Map; import javax.naming.Name; import javax.naming.directory.SearchControls; import org.apache.commons.lang.StringUtils; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.ldap.control.PagedResultsCookie; import org.springframework.ldap.control.PagedResultsDirContextProcessor; import org.springframework.ldap.core.ContextMapper; import org.springframework.ldap.core.DirContextAdapter; import org.springframework.ldap.core.DirContextOperations; import org.springframework.ldap.core.DistinguishedName; import org.springframework.ldap.core.LdapTemplate; import org.springframework.ldap.core.simple.ParameterizedContextMapper; import org.springframework.ldap.filter.AndFilter; import org.springframework.ldap.filter.EqualsFilter; import org.springframework.ldap.filter.WhitespaceWildcardsFilter; /** * Dao基层 * @创建人 PengBo * @创建时间 2013-7-7 下午7:03:49 */ @SuppressWarnings("unchecked") public class BaseDAO< T extends BaseModel> { @Autowired private LdapTemplate ldapTemplate; /** * 创建实体 * @param t * @创建人 PengBo * @创建时间 2013-7-7 下午6:53:40 */ public void create(T t) { DirContextAdapter context = new DirContextAdapter(buildDn(t)); mapToContext(t.getMap(), context); ldapTemplate.bind(context); } /** * 更新实体 * @param t * @创建人 PengBo * @创建时间 2013-7-7 下午6:53:56 */ public void update(T t) { DirContextOperations context = ldapTemplate.lookupContext(buildDn(t)); mapToContext(t.getMap(), context); ldapTemplate.modifyAttributes(context); } /** * 创建更新时使用的属性存储构造器 * @param map * @param context * @创建人 PengBo * @创建时间 2013-7-7 下午6:54:16 */ private void mapToContext(Mapmap, DirContextOperations context) { context.setAttributeValue("objectclass", "top"); for(String mkey:map.keySet()){ //获得实体的属性和对应的值 加入属性构造器中 if(map.get(mkey) != null) context.setAttributeValue(mkey, map.get(mkey)); } } /** * 删除属性 * @param t * @创建人 PengBo * @创建时间 2013-7-7 下午6:54:46 */ public void delete(T t) { ldapTemplate.unbind(buildDn(t)); } /** * 根据唯一DN进行查找 * @param t * @return * @创建人 PengBo * @创建时间 2013-7-7 下午6:55:02 */ public T findByPrimaryKey(final T t) { return (T) ldapTemplate.lookup(buildDn(t), getContextMapper(t)); } /** * 根据dn直接获取实体信息 * @param t * @param dn * @return * @创建人 PengBo * @创建时间 2013-7-29 下午4:39:59 */ public T findByDN(final T t,String dn) { return (T) ldapTemplate.lookup(dn, getContextMapper(t)); } /** * 根据实体条件精确查找进行查找 * @param t * @return 返回查找的集合 * @创建人 PengBo * @创建时间 2013-7-7 下午6:55:38 */ public List findByEqualFilter( final T t) { return ldapTemplate.search(buildDn(t), getEqualFilter(t).encode(), getContextMapper(t)); } /** * 根据实体条件进行查找 * @param t * @return 返回查找的集合 * @创建人 PengBo * @创建时间 2013-7-7 下午6:55:38 */ public List findByFilter( final T t) { return ldapTemplate.search(buildDn(t), getFilter(t).encode(), getContextMapper(t)); } /** * 根据实体类型查找所有实体 * @param t * @return 返回实体集合 * @创建人 PengBo * @创建时间 2013-7-7 下午6:56:13 */ public List findAll(final T t) { return ldapTemplate.search(buildDn(t), getObjectclass(t).encode(), getContextMapper(t)); } /** * 根据实体的分页属性进行查获早分页信息 * @param basePage * @return * @创建人 PengBo * @创建时间 2013-7-7 下午6:57:00 */ public Page getPages(Page basePage,T t){ int totalRow = findByFilter(t).size(); basePage.setContent(getAllPageMap(null,t,(basePage.getPageSize()*basePage.getPage()))); basePage.setTotalRow(totalRow); basePage.setTotalPage((totalRow+basePage.getPageSize()-1)/basePage.getPageSize()); return basePage; } /** * 根据传入记录数查处所需要的信息 * @param cookie * @param t * @param pageSize * @return * @创建人 PengBo * @创建时间 2013-7-10 上午9:23:46 */ private List getAllPageMap(PagedResultsCookie cookie,T t,Integer pageSize) { PagedResultsDirContextProcessor control = new PagedResultsDirContextProcessor (pageSize, cookie); SearchControls searchControls = new SearchControls(); searchControls.setSearchScope(SearchControls.SUBTREE_SCOPE); List mList = ldapTemplate.search(buildDn(t), getFilter(t).encode(),searchControls, getContextMapper(t), control); return mList; } /** * 查找全部信息所需要的filter检索方法 * @param map * @return * @创建人 PengBo * @创建时间 2013-7-7 下午6:59:38 */ private AndFilter getObjectclass(T t){ Map map=t.getMap(); AndFilter filter = new AndFilter(); for(String mkey:map.keySet()){ //根据实体只获得他对应的objectclass的值 if ("objectclass".equals(mkey)) { filter.and(new EqualsFilter(mkey, (String) map.get(mkey))); } } return filter; } /** * 根据条件模糊查找的条件方法 * @param t * @return * @创建人 PengBo * @创建时间 2013-7-7 下午7:00:10 */ private AndFilter getFilter(T t) { AndFilter filter = new AndFilter(); Map map=t.getMap(); for(String mkey:map.keySet()){ if ("objectclass".equals(mkey)) { filter.and(new EqualsFilter(mkey, (String) map.get(mkey))); } if(StringUtils.isNotBlank(map.get(mkey)) && !"objectclass".equals(mkey)) filter.and(new WhitespaceWildcardsFilter(mkey, (String) map.get(mkey))); } return filter; } /** * 根据条件精确查找的条件方法 * @param t * @return * @创建人 PengBo * @创建时间 2013-7-8 下午3:10:43 */ private AndFilter getEqualFilter(T t) { AndFilter filter = new AndFilter(); Map map=t.getMap(); for(String mkey:map.keySet()){ if ("objectclass".equals(mkey)) { filter.and(new EqualsFilter(mkey, (String) map.get(mkey))); } if(StringUtils.isNotBlank(map.get(mkey)) && !"objectclass".equals(mkey)) filter.and(new EqualsFilter(mkey, (String) map.get(mkey))); } return filter; } /** * 构造查询实体UUID方法 * @param t * @return * @创建人 PengBo * @创建时间 2013-7-7 下午7:00:49 */ private Name buildDn(T t) { String a = t.getDN(); DistinguishedName dn = new DistinguishedName(a); if(StringUtils.isNotBlank(t.getUuid())){ dn.add("uid", t.getUuid()); } return dn; } /** * 构造查找组织的dn * @param t * @return * @创建人 PengBo * @创建时间 2013-7-16 上午9:45:57 */ public String findDn(T t) { Name dn= buildDn( t); return dn.toString(); } /** * 查询获得实体属性构造器 * @param t * @return * @创建人 PengBo * @创建时间 2013-7-7 下午7:01:12 */ private ContextMapper getContextMapper(final T t) { return new ParameterizedContextMapper () { @Override public T mapFromContext(Object ctx) { DirContextAdapter adapter = (DirContextAdapter) ctx; T newT=null; try { newT = (T) t.getClass().newInstance(); } catch (InstantiationException e) { e.printStackTrace(); } catch (IllegalAccessException e) { e.printStackTrace(); } Map map= t.getMap(); Map smap=new HashMap (); for(String mkey:map.keySet()){ if (!"objectclass".equals(mkey)) { if(!"userPassword".equals(mkey)){ if (StringUtils.isNotBlank(adapter.getStringAttribute(mkey))) { smap.put(mkey, adapter.getStringAttribute(mkey)); }else { smap.put(mkey, null); } } } } newT.setMap(smap); return newT; } }; } }
第二个封装一个baseModel;
import java.util.Map; import com.smarcloud.control.util.Constant; /** * 实体基层 * @创建人 PengBo * @创建时间 2013-7-7 下午7:04:09 */ public class BaseModel extends UUIDEntity { private static final long serialVersionUID = -3809593908380530384L; /** 映射实体与LDAP属性*/ private Mapmap; /** 映射实体与LDAPDN*/ protected String getDN() { return Constant.BASE_DN; } protected Map getMap() { return map; } protected void setMap(Map map) { this.map = map; } }
剩下的就就是集成关系了 实体集成baseModel dao集成baseDao
接下来再给出2个集成的实体和dao
import java.util.HashMap; import java.util.Map; import org.apache.commons.lang.StringUtils; import com.smarcloud.control.base.BaseModel; import com.smarcloud.control.model.status.Status; import com.smarcloud.control.model.status.DeviceType; import com.smarcloud.control.util.Constant; /** * 设备对象 * @创建人 PengBo * @创建时间 2013-7-2 上午10:17:06 */ public class DeviceLDAP extends BaseModel{ private static final long serialVersionUID = 3398977021142608598L; /**设备ID guid*/ private String guid; /**设备面膜 userPassword*/ private String passWord; /**设备名称_ _ cn*/ private String deviceName; /** 状态 (注销、临时、正式 ) status*/ private Status deviceStatus; /**设备类型 deviceType*/ private DeviceType deviceType; /**设备所在房间 roomNumber*/ private String roomId; /**设备所在学校 o*/ private String schoolCode; public String getGuid() { return guid; } public void setGuid(String guid) { this.guid = guid; } public String getPassWord() { return passWord; } public void setPassWord(String passWord) { this.passWord = passWord; } public String getDeviceName() { return deviceName; } public void setDeviceName(String deviceName) { this.deviceName = deviceName; } public Status getDeviceStatus() { return deviceStatus; } public void setDeviceStatus(Status deviceStatus) { this.deviceStatus = deviceStatus; } public DeviceType getDeviceType() { return deviceType; } public void setDeviceType(DeviceType deviceType) { this.deviceType = deviceType; } public String getRoomId() { return roomId; } public void setRoomId(String roomId) { this.roomId = roomId; } public String getSchoolCode() { return schoolCode; } public void setSchoolCode(String schoolCode) { this.schoolCode = schoolCode; } @Override public Map getMap() { Map map = new HashMap (); map.put("objectclass","smartDevice"); map.put("uid", this.getUuid()); map.put("guid", this.guid); String newCn = null; if(StringUtils.isNotBlank(this.guid)) newCn =this.deviceType==null?null:this.deviceType.toString()+"_"+this.guid+"_"+this.roomId; map.put("cn", newCn); map.put("userPassword", this.passWord); map.put("status", this.deviceStatus==null?null:this.deviceStatus.toString()); map.put("deviceType", this.deviceType==null?null:this.deviceType.toString()); map.put("roomNumber", this.roomId); map.put("o", this.schoolCode); return map; } @Override public void setMap(Map map) { for(String mkey:map.keySet()){ switch(mkey) { case "uid": this.setUuid(map.get(mkey)); break; case "cn": this.setDeviceName(map.get(mkey)); break; case "guid": this.setGuid(map.get(mkey)); break; case "userPassword": this.setPassWord(map.get(mkey)); break; case "roomNumber": this.setRoomId(map.get(mkey)); break; case "o": this.setSchoolCode(map.get(mkey)); break; case "status": if (StringUtils.isNotBlank(map.get(mkey))) { this.setDeviceStatus(Status.valueOf(map.get(mkey))); } break; case "deviceType": if (StringUtils.isNotBlank(map.get(mkey))) { this.setDeviceType(DeviceType.valueOf(map.get(mkey))); } break; } } } @Override protected String getDN() { //自定义的组织dn return Constant.DEVICE_BASE_DN; }
使用setmap 和getmap 来映射实体与ldap属性 ;
import org.springframework.stereotype.Repository; import com.smarcloud.control.base.BaseDAO; import com.smarcloud.control.model.DeviceLDAP; /** * 设备Dao实现 * @创建人 PengBo * @创建时间 2013-7-2 下午1:54:51 */ @Repository public class DeviceLDAPDao extends BaseDAO{ }
这个DAO空的就可以了
接下来的使用 就跟大家使用JPA一样一样滴 把你的实体写好 放进去就可以了 不过你在新建时是不返回任何东西的 所以你可以自己去多写一个方法去获得创建好的实体。