package org.safehaus.penrose.source;
import org.safehaus.penrose.partition.Partition;
import org.safehaus.penrose.connection.Connection;
import org.safehaus.penrose.ldap.Attributes;
import org.safehaus.penrose.ldap.DN;
import org.safehaus.penrose.ldap.*;
import org.safehaus.penrose.filter.Filter;
import org.safehaus.penrose.filter.FilterTool;
import org.safehaus.penrose.session.Session;
import org.safehaus.penrose.session.SessionManager;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import java.util.*;
/**
* @author Endi S. Dewata
*/
public class Source implements Cloneable {
public Logger log = LoggerFactory.getLogger(getClass());
protected SourceConfig sourceConfig;
protected SourceContext sourceContext;
protected Partition partition;
protected Map<String,Field> fields = new LinkedHashMap<String,Field>();
protected Map<String,Field> fieldsByOriginalName = new LinkedHashMap<String,Field>();
protected Collection<Field> primaryKeyFields = new ArrayList<Field>();
public Source() {
}
public void init(SourceConfig sourceConfig, SourceContext sourceContext) throws Exception {
log.debug("Initializing source "+sourceConfig.getName()+".");
this.sourceConfig = sourceConfig;
this.sourceContext = sourceContext;
Collection<FieldConfig> fieldConfigs = sourceConfig.getFieldConfigs();
for (FieldConfig fieldConfig : fieldConfigs) {
Field field = new Field(this, fieldConfig);
addField(field);
}
partition = sourceContext.getPartition();
init();
}
public void init() throws Exception {
}
public void destroy() throws Exception {
}
public String getDescription() {
return sourceConfig.getDescription();
}
public void addField(Field field) {
fields.put(field.getName().toLowerCase(), field);
fieldsByOriginalName.put(field.getOriginalName().toLowerCase(), field);
if (field.isPrimaryKey()) primaryKeyFields.add(field);
}
public String getName() {
return sourceConfig.getName();
}
public String getAdapterName() {
return sourceContext.getAdapter().getName();
}
public String getConnectionName() {
return sourceConfig.getConnectionName();
}
public Connection getConnection() {
return sourceContext.getConnection();
}
public void setName(String name) {
sourceConfig.setName(name);
}
public SourceConfig getSourceConfig() {
return sourceConfig;
}
public void setSourceConfig(SourceConfig sourceConfig) {
this.sourceConfig = sourceConfig;
}
public Partition getPartition() {
return sourceContext.getPartition();
}
public Partition getPartition(String name) {
return sourceContext.getPartition().getPartitionContext().getPartition(name);
}
public String getParameter(String name) {
return sourceConfig.getParameter(name);
}
public Collection<String> getParameterNames() {
return sourceConfig.getParameterNames();
}
public Map<String,String> getParameters() {
return sourceConfig.getParameters();
}
public void setParameter(String name, String value) {
sourceConfig.setParameter(name, value);
}
public Collection<String> getPrimaryKeyNames() {
return sourceConfig.getPrimaryKeyNames();
}
public Collection<Field> getPrimaryKeyFields() {
return primaryKeyFields;
}
public Field getPrimaryKeyField() {
return primaryKeyFields.iterator().next();
}
public Collection<Field> getFields() {
return fields.values();
}
public Collection<String> getFieldNames() {
return sourceConfig.getFieldNames();
}
public Collection<String> getFieldOriginalNames() {
return sourceConfig.getFieldOriginalNames();
}
public Field getField(String fieldName) {
return fields.get(fieldName.toLowerCase());
}
public Field getFieldByOriginalName(String fieldOriginalName) {
return fieldsByOriginalName.get(fieldOriginalName.toLowerCase());
}
public SourceContext getSourceContext() {
return sourceContext;
}
public void setSourceContext(SourceContext sourceContext) {
this.sourceContext = sourceContext;
}
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
// Add
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
public AddResponse add(
Session session,
String dn,
Attributes attributes
) throws Exception {
return add(session, new DN(dn), attributes);
}
public AddResponse add(
Session session,
RDN rdn,
Attributes attributes
) throws Exception {
return add(session, new DN(rdn), attributes);
}
public AddResponse add(
Session session,
DN dn,
Attributes attributes
) throws Exception {
AddRequest request = new AddRequest();
request.setDn(dn);
request.setAttributes(attributes);
AddResponse response = new AddResponse();
add(session, request, response);
return response;
}
public void add(
Session session,
AddRequest request,
AddResponse response
) throws Exception {
boolean debug = log.isDebugEnabled();
if (debug) log.debug("Adding "+request.getDn()+".");
}
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
// Bind
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
public BindResponse bind(
Session session,
String dn,
byte[] password
) throws Exception {
return bind(session, new DN(dn), password);
}
public BindResponse bind(
Session session,
RDN rdn,
byte[] password
) throws Exception {
return bind(session, new DN(rdn), password);
}
public BindResponse bind(
Session session,
DN dn,
byte[] password
) throws Exception {
BindRequest request = new BindRequest();
request.setDn(dn);
request.setPassword(password);
BindResponse response = new BindResponse();
bind(session, request, response);
return response;
}
public void bind(
Session session,
BindRequest request,
BindResponse response
) throws Exception {
bind(session, request, response, null);
}
public void bind(
Session session,
BindRequest request,
BindResponse response,
Attributes attributes
) throws Exception {
boolean debug = log.isDebugEnabled();
if (debug) log.debug("Binding as "+request.getDn()+".");
throw LDAP.createException(LDAP.LDAP_NOT_SUPPORTED);
}
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
// Compare
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
public void compare(
Session session,
CompareRequest request,
CompareResponse response
) throws Exception {
boolean debug = log.isDebugEnabled();
if (debug) log.debug("Compare "+request.getDn()+".");
//connection.compare(null, this, request, response);
}
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
// Delete
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
public DeleteResponse delete(
Session session,
String dn
) throws Exception {
return delete(session, new DN(dn));
}
public DeleteResponse delete(
Session session,
RDN rdn
) throws Exception {
return delete(session, new DN(rdn));
}
public DeleteResponse delete(
Session session,
DN dn
) throws Exception {
DeleteRequest request = new DeleteRequest();
request.setDn(dn);
DeleteResponse response = new DeleteResponse();
delete(session, request, response);
return response;
}
public void delete(
Session session,
DeleteRequest request,
DeleteResponse response
) throws Exception {
boolean debug = log.isDebugEnabled();
if (debug) log.debug("Deleting "+request.getDn()+".");
}
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
// Find
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
public Session createAdminSession() throws Exception {
SessionManager sessionManager = getPartition().getPartitionContext().getSessionManager();
return sessionManager.createAdminSession();
}
public SearchResult find(DN dn) throws Exception {
Session session = createAdminSession();
try {
return find(session, dn);
} finally {
session.close();
}
}
public SearchResult find(Session session, String dn) throws Exception {
return find(session, new DN(dn));
}
public SearchResult find(Session session, RDN rdn) throws Exception {
return find(session, new DN(rdn));
}
public SearchResult find(Session session, DN dn) throws Exception {
boolean debug = log.isDebugEnabled();
if (debug) log.debug("Finding "+dn+".");
SearchResponse response = search(session, dn, null, SearchRequest.SCOPE_BASE);
int rc = response.getReturnCode();
if (rc == LDAP.NO_SUCH_OBJECT) return null;
if (rc != LDAP.SUCCESS) throw response.getException();
if (!response.hasNext()) return null;
return response.next();
}
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
// Modify
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
public ModifyResponse modify(
Session session,
String dn,
Collection<Modification> modifications
) throws Exception {
return modify(session, new DN(dn), modifications);
}
public ModifyResponse modify(
Session session,
RDN rdn,
Collection<Modification> modifications
) throws Exception {
return modify(session, new DN(rdn), modifications);
}
public ModifyResponse modify(
Session session,
DN dn,
Collection<Modification> modifications
) throws Exception {
ModifyRequest request = new ModifyRequest();
request.setDn(dn);
request.setModifications(modifications);
ModifyResponse response = new ModifyResponse();
modify(session, request, response);
return response;
}
public void modify(
Session session,
ModifyRequest request,
ModifyResponse response
) throws Exception {
boolean debug = log.isDebugEnabled();
if (debug) log.debug("Modifying "+request.getDn()+".");
}
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
// ModRdn
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
public ModRdnResponse modrdn(
Session session,
String dn,
String newRdn,
boolean deleteOldRdn
) throws Exception {
return modrdn(session, new DN(dn), new RDN(newRdn), deleteOldRdn);
}
public ModRdnResponse modrdn(
Session session,
RDN rdn,
RDN newRdn,
boolean deleteOldRdn
) throws Exception {
return modrdn(session, new DN(rdn), newRdn, deleteOldRdn);
}
public ModRdnResponse modrdn(
Session session,
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();
modrdn(session, request, response);
return response;
}
public void modrdn(
Session session,
ModRdnRequest request,
ModRdnResponse response
) throws Exception {
boolean debug = log.isDebugEnabled();
if (debug) log.debug("Renaming "+request.getDn()+".");
}
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
// Search
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
public SearchResponse search(
Session session,
String dn,
String filter,
int scope
) throws Exception {
return search(session, new DN(dn), FilterTool.parseFilter(filter), scope);
}
public SearchResponse search(
Session session,
RDN rdn,
Filter filter,
int scope
) throws Exception {
return search(session, new DN(rdn), filter, scope);
}
public SearchResponse search(
Session session,
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();
search(session, request, response);
return response;
}
public void search(
Session session,
SearchRequest request,
SearchResponse response
) throws Exception {
boolean debug = log.isDebugEnabled();
if (debug) log.debug("Searching "+request.getDn()+".");
response.close();
}
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
// Unbind
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
public void unbind(
Session session,
UnbindRequest request,
UnbindResponse response
) throws Exception {
boolean debug = log.isDebugEnabled();
if (debug) log.debug("Unbinding as "+request.getDn()+".");
throw LDAP.createException(LDAP.LDAP_NOT_SUPPORTED);
}
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
// Table
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
public void create() throws Exception {
throw LDAP.createException(LDAP.OPERATIONS_ERROR);
}
public void rename(Source newSource) throws Exception {
throw LDAP.createException(LDAP.OPERATIONS_ERROR);
}
public void drop() throws Exception {
throw LDAP.createException(LDAP.OPERATIONS_ERROR);
}
public void clear(Session session) throws Exception {
throw LDAP.createException(LDAP.OPERATIONS_ERROR);
}
public void status() throws Exception {
throw LDAP.createException(LDAP.OPERATIONS_ERROR);
}
public long getCount(Session session) throws Exception {
throw LDAP.createException(LDAP.OPERATIONS_ERROR);
}
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
// Clone
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
public Object clone() throws CloneNotSupportedException {
Source source = (Source)super.clone();
source.sourceConfig = (SourceConfig)sourceConfig.clone();
source.sourceContext = sourceContext;
source.fields = new LinkedHashMap<String,Field>();
source.fieldsByOriginalName = new LinkedHashMap<String,Field>();
source.primaryKeyFields = new ArrayList<Field>();
for (Field field : fields.values()) {
source.addField((Field)field.clone());
}
return source;
}
}