package org.safehaus.penrose.management.partition; import org.safehaus.penrose.filter.Filter; import org.safehaus.penrose.ldap.*; import org.safehaus.penrose.management.BaseService; import org.safehaus.penrose.management.PenroseJMXService; import org.safehaus.penrose.management.connection.ConnectionManagerService; import org.safehaus.penrose.management.directory.DirectoryService; import org.safehaus.penrose.management.mapping.MappingManagerService; import org.safehaus.penrose.management.module.ModuleManagerService; import org.safehaus.penrose.management.scheduler.SchedulerService; import org.safehaus.penrose.management.source.SourceManagerService; import org.safehaus.penrose.partition.*; import org.safehaus.penrose.session.Session; import org.safehaus.penrose.session.SessionManager; import java.util.Collection; /** * @author Endi Sukma Dewata */ public class PartitionService extends BaseService implements PartitionServiceMBean { private PartitionManager partitionManager; private String partitionName; ConnectionManagerService connectionManagerService; SourceManagerService sourceManagerService; MappingManagerService mappingManagerService; DirectoryService directoryService; ModuleManagerService moduleManagerService; SchedulerService schedulerService; public PartitionService(PenroseJMXService jmxService, PartitionManager partitionManager, String partitionName) throws Exception { this.jmxService = jmxService; this.partitionManager = partitionManager; this.partitionName = partitionName; } public String getObjectName() { return PartitionClient.getStringObjectName(partitionName); } public Object getObject() { return getPartition(); } public PartitionConfig getPartitionConfig() throws Exception { return partitionManager.getPartitionConfig(partitionName); } public Partition getPartition() { return partitionManager.getPartition(partitionName); } public void start() throws Exception { partitionManager.startPartition(partitionName); } public void stop() throws Exception { partitionManager.stopPartition(partitionName); } public String getStatus() { return getPartition() == null ? "STOPPED" : "STARTED"; } public void store() throws Exception { partitionManager.storePartition(partitionName); } public void init() throws Exception { //log.debug("Registering partition "+partitionName+"."); super.init(); connectionManagerService = new ConnectionManagerService(jmxService, partitionManager, partitionName); connectionManagerService.init(); sourceManagerService = new SourceManagerService(jmxService, partitionManager, partitionName); sourceManagerService.init(); mappingManagerService = new MappingManagerService(jmxService, partitionManager, partitionName); mappingManagerService.init(); directoryService = new DirectoryService(jmxService, partitionManager, partitionName); directoryService.init(); moduleManagerService = new ModuleManagerService(jmxService, partitionManager, partitionName); moduleManagerService.init(); schedulerService = new SchedulerService(jmxService, partitionManager, partitionName); schedulerService.init(); } public void destroy() throws Exception { //log.debug("Unregistering partition "+partitionName+"."); schedulerService.destroy(); moduleManagerService.destroy(); directoryService.destroy(); mappingManagerService.destroy(); sourceManagerService.destroy(); connectionManagerService.destroy(); super.destroy(); } public PenroseJMXService getJmxService() { return jmxService; } public void setJmxService(PenroseJMXService jmxService) { this.jmxService = jmxService; } //////////////////////////////////////////////////////////////////////////////////////////////////////////////////// // Add //////////////////////////////////////////////////////////////////////////////////////////////////////////////////// public AddResponse add( String dn, Attributes attributes ) throws Exception { AddRequest request = new AddRequest(); request.setDn(dn); request.setAttributes(attributes); AddResponse response = new AddResponse(); return add(request, response); } public AddResponse add( RDN rdn, Attributes attributes ) throws Exception { AddRequest request = new AddRequest(); request.setDn(rdn); request.setAttributes(attributes); AddResponse response = new AddResponse(); return add(request, response); } public AddResponse add( DN dn, Attributes attributes ) throws Exception { AddRequest request = new AddRequest(); request.setDn(dn); request.setAttributes(attributes); AddResponse response = new AddResponse(); return add(request, response); } public AddResponse add( AddRequest request, AddResponse response ) throws Exception { boolean debug = log.isDebugEnabled(); Partition partition = getPartition(); if (debug) log.debug("Adding "+request.getDn()+"."); Session session = getSession(); try { partition.add(session, request, response); int rc = response.getReturnCode(); log.debug("RC: "+rc); return response; } finally { session.close(); if (debug) log.debug("Add completed."); } } //////////////////////////////////////////////////////////////////////////////////////////////////////////////////// // Delete //////////////////////////////////////////////////////////////////////////////////////////////////////////////////// public DeleteResponse delete( String dn ) throws Exception { DeleteRequest request = new DeleteRequest(); request.setDn(dn); DeleteResponse response = new DeleteResponse(); return delete(request, response); } public DeleteResponse delete( RDN rdn ) throws Exception { DeleteRequest request = new DeleteRequest(); request.setDn(rdn); DeleteResponse response = new DeleteResponse(); return delete(request, response); } public DeleteResponse delete( DN dn ) throws Exception { DeleteRequest request = new DeleteRequest(); request.setDn(dn); DeleteResponse response = new DeleteResponse(); return delete(request, response); } public DeleteResponse delete( DeleteRequest request, DeleteResponse response ) throws Exception { boolean debug = log.isDebugEnabled(); Partition partition = getPartition(); if (debug) log.debug("Deleting "+request.getDn()+"."); Session session = getSession(); try { partition.delete(session, request, response); int rc = response.getReturnCode(); log.debug("RC: "+rc); return response; } finally { session.close(); if (debug) log.debug("Delete completed."); } } //////////////////////////////////////////////////////////////////////////////////////////////////////////////////// // Find //////////////////////////////////////////////////////////////////////////////////////////////////////////////////// public SearchResult find( String dn ) throws Exception { return find(new DN(dn)); } public SearchResult find( RDN rdn ) throws Exception { return find(new DN(rdn)); } public SearchResult find( DN dn ) throws Exception { boolean debug = log.isDebugEnabled(); Partition partition = getPartition(); if (debug) log.debug("Finding "+dn+"."); Session session = getSession(); try { return partition.find(session, dn); } finally { session.close(); if (debug) log.debug("Find completed."); } } //////////////////////////////////////////////////////////////////////////////////////////////////////////////////// // Modify //////////////////////////////////////////////////////////////////////////////////////////////////////////////////// public ModifyResponse modify( String dn, Collection<Modification> modifications ) throws Exception { ModifyRequest request = new ModifyRequest(); request.setDn(dn); request.setModifications(modifications); ModifyResponse response = new ModifyResponse(); return modify(request, response); } public ModifyResponse modify( RDN rdn, Collection<Modification> modifications ) throws Exception { ModifyRequest request = new ModifyRequest(); request.setDn(rdn); request.setModifications(modifications); ModifyResponse response = new ModifyResponse(); return modify(request, response); } public ModifyResponse modify( DN dn, Collection<Modification> modifications ) throws Exception { ModifyRequest request = new ModifyRequest(); request.setDn(dn); request.setModifications(modifications); ModifyResponse response = new ModifyResponse(); return modify(request, response); } public ModifyResponse modify( ModifyRequest request, ModifyResponse response ) throws Exception { boolean debug = log.isDebugEnabled(); Partition partition = getPartition(); if (debug) log.debug("Modifying "+request.getDn()+"."); Session session = getSession(); try { partition.modify(session, request, response); int rc = response.getReturnCode(); log.debug("RC: "+rc); return response; } finally { session.close(); if (debug) log.debug("Modify completed."); } } //////////////////////////////////////////////////////////////////////////////////////////////////////////////////// // ModRdn //////////////////////////////////////////////////////////////////////////////////////////////////////////////////// public ModRdnResponse modrdn( String dn, String newRdn, boolean deleteOldRdn ) throws Exception { ModRdnRequest request = new ModRdnRequest(); request.setDn(dn); request.setNewRdn(newRdn); request.setDeleteOldRdn(deleteOldRdn); ModRdnResponse response = new ModRdnResponse(); return modrdn(request, response); } public ModRdnResponse modrdn( RDN dn, RDN newRdn, boolean deleteOldRdn ) throws Exception { ModRdnRequest request = new ModRdnRequest(); request.setDn(dn); request.setNewRdn(newRdn); request.setDeleteOldRdn(deleteOldRdn); ModRdnResponse response = new ModRdnResponse(); return modrdn(request, response); } public ModRdnResponse modrdn( DN dn, RDN newRdn, boolean deleteOldRdn ) throws Exception { ModRdnRequest request = new ModRdnRequest(); request.setDn(dn); request.setNewRdn(newRdn); request.setDeleteOldRdn(deleteOldRdn); ModRdnResponse response = new ModRdnResponse(); return modrdn(request, response); } public ModRdnResponse modrdn( ModRdnRequest request, ModRdnResponse response ) throws Exception { boolean debug = log.isDebugEnabled(); Partition partition = getPartition(); if (debug) log.debug("Renaming "+request.getDn()+"."); Session session = getSession(); try { partition.modrdn(session, request, response); int rc = response.getReturnCode(); log.debug("RC: "+rc); return response; } finally { session.close(); if (debug) log.debug("Rename completed."); } } //////////////////////////////////////////////////////////////////////////////////////////////////////////////////// // Search //////////////////////////////////////////////////////////////////////////////////////////////////////////////////// public SearchResponse search( String dn, String filter, Integer scope ) throws Exception { SearchRequest request = new SearchRequest(); request.setDn(dn); request.setFilter(filter); request.setScope(scope); SearchResponse response = new SearchResponse(); return search(request, response); } public SearchResponse search( RDN rdn, Filter filter, Integer scope ) throws Exception { SearchRequest request = new SearchRequest(); request.setDn(rdn); request.setFilter(filter); request.setScope(scope); SearchResponse response = new SearchResponse(); return search(request, response); } public SearchResponse search( DN dn, Filter filter, Integer scope ) throws Exception { SearchRequest request = new SearchRequest(); request.setDn(dn); request.setFilter(filter); request.setScope(scope); SearchResponse response = new SearchResponse(); return search(request, response); } public SearchResponse search( SearchRequest request, SearchResponse response ) throws Exception { boolean debug = log.isDebugEnabled(); Partition partition = getPartition(); if (debug) log.debug("Searching "+request.getDn()+"."); Session session = getSession(); try { partition.search(session, request, response); int rc = response.waitFor(); log.debug("RC: "+rc); return response; } finally { session.close(); if (debug) log.debug("Search completed."); } } public Session getSession() throws Exception { Partition partition = getPartition(); SessionManager sessionManager = partition.getPartitionContext().getSessionManager(); return sessionManager.createAdminSession(); } }