blob: efbb1f875d33a9e0dfd6502e26110fc2c48ce097 [file] [log] [blame]
/*
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you under the Apache License, Version 2.0 (the
* "License"); you may not use this file except in compliance
* with the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing,
* software distributed under the License is distributed on an
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
* KIND, either express or implied. See the License for the
* specific language governing permissions and limitations
* under the License.
*
*/
package org.apache.directory.fortress.core.impl;
import java.util.ArrayList;
import java.util.List;
import java.util.Properties;
import org.apache.directory.api.ldap.model.entry.Entry;
import org.apache.directory.api.ldap.model.entry.Modification;
import org.apache.directory.api.ldap.model.exception.LdapException;
import org.apache.directory.api.ldap.model.exception.LdapNoSuchObjectException;
import org.apache.directory.fortress.core.FinderException;
import org.apache.directory.fortress.core.GlobalErrIds;
import org.apache.directory.fortress.core.GlobalIds;
import org.apache.directory.fortress.core.UpdateException;
import org.apache.directory.fortress.core.ldap.LdapDataProvider;
import org.apache.directory.fortress.core.model.FortEntity;
import org.apache.directory.fortress.core.util.PropUtil;
import org.apache.directory.ldap.client.api.LdapConnection;
final class PropertyDAO extends LdapDataProvider
{
/**
* Add properties to the provided entity using the provided property provider
*
* @param entity A FortressEntity that supports properties (Role, AdminRole, Group, Permission, PermObj)
* @param properties
* @param propProvider DAO for entity type that implements property provider interface
* @return Entity with current property value
* @throws UpdateException
* @throws FinderException
*/
FortEntity addProperties( FortEntity entity, Properties properties, PropertyProvider propProvider ) throws UpdateException, FinderException
{
LdapConnection ld = null;
String entityDn = propProvider.getDn( entity );
try
{
List<Modification> mods = new ArrayList<Modification>();
loadProperties( properties, mods, GlobalIds.PROPS, false );
ld = getAdminConnection();
modify( ld, entityDn, mods, entity );
}
catch ( LdapException e )
{
String error = "add entity properties[" + entity.getClass().getSimpleName() + "] caught LDAPException=" + e;
throw new UpdateException( GlobalErrIds.USER_UPDATE_FAILED, error, e );
}
finally
{
closeAdminConnection( ld );
}
return propProvider.getEntity( entity );
}
/**
* Update properties on the provided entity using the provided property provider
*
* @param entity A FortressEntity that supports properties (Role, AdminRole, Group, Permission, PermObj)
* @param properties
* @param propProvider DAO for entity type that implements property provider interface
* @return Entity with current property value
* @throws UpdateException
* @throws FinderException
*/
FortEntity updateProperties( FortEntity entity, Properties properties, PropertyProvider propProvider ) throws UpdateException, FinderException
{
//ftProps all have same name, so will need to delete proprs first, then readd ones that are approprirate
//get current properties
Properties currentProps = this.getProperties( entity, propProvider );
Properties toDeleteProps = new Properties();
//look for proeprties (ftProp=key:value) that are being updated and add to delete list
for(Object key : properties.keySet()){
String value = currentProps.getProperty( (String)key );
toDeleteProps.put( (String)key, value );
}
//delete exising properties
this.deleteProperties( entity, toDeleteProps, propProvider );
//add the udpates back
this.addProperties( entity, properties, propProvider );
return propProvider.getEntity( entity );
}
/**
* Delete properties to the provided entity using the provided property provider
*
* @param entity A FortressEntity that supports properties (Role, AdminRole, Group, Permission, PermObj)
* @param properties
* @param propProvider DAO for entity type that implements property provider interface
* @throws UpdateException
* @throws FinderException
*/
void deleteProperties( FortEntity entity, Properties properties, PropertyProvider propProvider ) throws UpdateException, FinderException
{
LdapConnection ld = null;
String entityDn = propProvider.getDn( entity );
try
{
List<Modification> mods = new ArrayList<Modification>();
removeProperties( properties, mods, GlobalIds.PROPS );
ld = getAdminConnection();
modify( ld, entityDn, mods, entity );
}
catch ( LdapException e )
{
String error = "delete entity properties[" + entity.getClass().getSimpleName() + "] caught LDAPException=" + e;
throw new UpdateException( GlobalErrIds.USER_UPDATE_FAILED, error, e );
}
finally
{
closeAdminConnection( ld );
}
}
/**
* Get properties on the provided entity using the provided property provider
*
* @param entity A FortressEntity that supports properties (Role, AdminRole, Group, Permission, PermObj)
* @param propProvider DAO for entity type that implements property provider interface
* @return Current properties of entity
* @throws FinderException
*/
Properties getProperties( FortEntity entity, PropertyProvider propProvider ) throws FinderException
{
Properties props = null;
LdapConnection ld = null;
String entityDn = propProvider.getDn( entity );
try
{
ld = getAdminConnection();
Entry findEntry = read( ld, entityDn, new String[]{ GlobalIds.PROPS } );
props = PropUtil.getProperties( getAttributes( findEntry, GlobalIds.PROPS ) );
if( props == null ){
props = new Properties();
}
}
catch ( LdapNoSuchObjectException e )
{
String warning = "get properties COULD NOT FIND ENTRY for entity [" + entityDn + "]";
throw new FinderException( GlobalErrIds.ENTITY_PROPS_NOT_FOUND, warning );
}
catch ( LdapException e )
{
String error = "get properties [" + entityDn + "]= caught LDAPException=" + e;
throw new FinderException( GlobalErrIds.ENTITY_PROPS_LOAD_FAILED, error, e );
}
finally
{
closeAdminConnection( ld );
}
return props;
}
}