package org.safehaus.penrose.management.source; import org.safehaus.penrose.connection.ConnectionConfig; import org.safehaus.penrose.connection.ConnectionConfigManager; 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.partition.Partition; import org.safehaus.penrose.partition.PartitionConfig; import org.safehaus.penrose.partition.PartitionManager; import org.safehaus.penrose.session.Session; import org.safehaus.penrose.session.SessionManager; import org.safehaus.penrose.source.*; import org.ietf.ldap.LDAPException; import java.util.Collection; import java.util.ArrayList; /** * @author Endi Sukma Dewata */ public class SourceService extends BaseService implements SourceServiceMBean { private PartitionManager partitionManager; private String partitionName; private String sourceName; public SourceService( PenroseJMXService jmxService, PartitionManager partitionManager, String partitionName, String sourceName ) throws Exception { this.jmxService = jmxService; this.partitionManager = partitionManager; this.partitionName = partitionName; this.sourceName = sourceName; } public String getObjectName() { return SourceClient.getStringObjectName(partitionName, sourceName); } public Object getObject() { return getSource(); } public SourceConfig getSourceConfig() throws Exception { return getPartitionConfig().getSourceConfigManager().getSourceConfig(sourceName); } public void setSourceConfig(SourceConfig sourceConfig) throws Exception { getPartitionConfig().getSourceConfigManager().updateSourceConfig(sourceConfig); } public Source getSource() { Partition partition = getPartition(); if (partition == null) return null; return partition.getSourceManager().getSource(sourceName); } public PartitionConfig getPartitionConfig() { return partitionManager.getPartitionConfig(partitionName); } public Partition getPartition() { return partitionManager.getPartition(partitionName); } public Session createAdminSession() throws Exception { Partition partition = getPartition(); SessionManager sessionManager = partition.getPartitionContext().getSessionManager(); return sessionManager.createAdminSession(); } public String getStatus() throws Exception { Source source = getSource(); return source == null ? SourceServiceMBean.STOPPED : SourceServiceMBean.STARTED; } public Long getCount() throws Exception { Session session = createAdminSession(); try { Source source = getSource(); if (source == null) throw new Exception("Source "+sourceName+" not found."); return source.getCount(session); } finally { session.close(); } } public void create() throws Exception { log.debug("Creating source "+partitionName+"/"+sourceName+"..."); Source source = getSource(); if (source == null) throw new Exception("Source "+sourceName+" not found."); source.create(); log.debug("Source created."); } public void clear() throws Exception { log.debug("Clearing source "+partitionName+"/"+sourceName+"..."); Session session = createAdminSession(); try { Source source = getSource(); if (source == null) throw new Exception("Source "+sourceName+" not found."); source.clear(session); } finally { session.close(); } log.debug("Source cleared."); } public void drop() throws Exception { log.debug("Dropping source "+partitionName+"/"+sourceName+"..."); Source source = getSource(); if (source == null) throw new Exception("Source "+sourceName+" not found."); source.drop(); log.debug("Source dropped."); } public String getAdapterName() throws Exception { SourceConfig sourceConfig = getSourceConfig(); String partitionName = sourceConfig.getPartitionName(); String connectionName = sourceConfig.getConnectionName(); PartitionConfig partitionConfig; if (partitionName == null) { partitionConfig = getPartitionConfig(); } else { partitionConfig = partitionManager.getPartitionConfig(partitionName); } ConnectionConfigManager connectionConfigManager = partitionConfig.getConnectionConfigManager(); ConnectionConfig connectionConfig = connectionConfigManager.getConnectionConfig(connectionName); if (connectionConfig == null) return null; return connectionConfig.getAdapterName(); } public String getConnectionName() throws Exception { SourceConfig sourceConfig = getSourceConfig(); return sourceConfig.getConnectionName(); } public Collection<String> getFieldNames() throws Exception { Collection<String> list = new ArrayList<String>(); SourceConfig sourceConfig = getSourceConfig(); list.addAll(sourceConfig.getFieldNames()); return list; } public Collection<FieldConfig> getFieldConfigs() throws Exception { Collection<FieldConfig> list = new ArrayList<FieldConfig>(); SourceConfig sourceConfig = getSourceConfig(); list.addAll(sourceConfig.getFieldConfigs()); return list; } public String getParameter(String name) throws Exception { SourceConfig sourceConfig = getSourceConfig(); return sourceConfig.getParameter(name); } public Collection<String> getParameterNames() throws Exception { Collection<String> list = new ArrayList<String>(); SourceConfig sourceConfig = getSourceConfig(); list.addAll(sourceConfig.getParameterNames()); return list; } //////////////////////////////////////////////////////////////////////////////////////////////////////////////////// // 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 { Session session = createAdminSession(); try { Source source = getSource(); if (source == null) throw new Exception("Source "+sourceName+" not found."); source.add(session, request, response); int rc = response.getReturnCode(); log.debug("RC: "+rc); } catch (LDAPException e) { response.setException(e); } finally { session.close(); } return response; } //////////////////////////////////////////////////////////////////////////////////////////////////////////////////// // 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 { Session session = createAdminSession(); try { Source source = getSource(); if (source == null) throw new Exception("Source "+sourceName+" not found."); source.delete(session, request, response); int rc = response.getReturnCode(); log.debug("RC: "+rc); } catch (LDAPException e) { response.setException(e); } finally { session.close(); } return response; } //////////////////////////////////////////////////////////////////////////////////////////////////////////////////// // 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 { Session session = createAdminSession(); try { Source source = getSource(); if (source == null) throw new Exception("Source "+sourceName+" not found."); return source.find(session, dn); } finally { session.close(); } } //////////////////////////////////////////////////////////////////////////////////////////////////////////////////// // 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 { Session session = createAdminSession(); try { Source source = getSource(); if (source == null) throw new Exception("Source "+sourceName+" not found."); source.modify(session, request, response); int rc = response.getReturnCode(); log.debug("RC: "+rc); } catch (LDAPException e) { response.setException(e); } finally { session.close(); } return response; } //////////////////////////////////////////////////////////////////////////////////////////////////////////////////// // 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 rdn, RDN newRdn, boolean deleteOldRdn ) throws Exception { ModRdnRequest request = new ModRdnRequest(); request.setDn(rdn); 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 { Session session = createAdminSession(); try { Source source = getSource(); if (source == null) throw new Exception("Source "+sourceName+" not found."); source.modrdn(session, request, response); int rc = response.getReturnCode(); log.debug("RC: "+rc); } catch (LDAPException e) { response.setException(e); } finally { session.close(); } return response; } //////////////////////////////////////////////////////////////////////////////////////////////////////////////////// // Search //////////////////////////////////////////////////////////////////////////////////////////////////////////////////// public SearchResponse search( String dn, String filter, int 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, int 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, int 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 { Session session = createAdminSession(); try { Source source = getSource(); if (source == null) throw new Exception("Source "+sourceName+" not found."); source.search(session, request, response); int rc = response.waitFor(); log.debug("RC: "+rc); } catch (LDAPException e) { response.setException(e); } finally { session.close(); } return response; } }