blob: 55db66f3a146e33c10b5e2993bb25d9c84e4c40a [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 org.apache.commons.lang.StringUtils;
import org.apache.directory.fortress.core.ValidationException;
import org.apache.directory.fortress.core.model.Suffix;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.apache.directory.fortress.core.GlobalErrIds;
import org.apache.directory.fortress.core.GlobalIds;
import org.apache.directory.fortress.core.SecurityException;
import org.apache.directory.fortress.core.util.VUtil;
/**
* Process module for the suffix or root node of Fortress directory structure. The suffix represents the topmost node in a
* directory information tree. For example dc=companyName,dc=com. The suffix data is passed using
* {@link org.apache.directory.fortress.core.model.Suffix} class. This class does perform simple data validations.
* The {@link org.apache.directory.fortress.core.ant.FortressAntTask#addSuffixes()} method calls the {@link #add} from this
* class during initial base loads. Removal {@link org.apache.directory.fortress.core.ant.FortressAntTask#deleteSuffixes()}
* is performed during regression tests and should never be executed targeting production directory systems.<br>
* This class will accept {@link org.apache.directory.fortress.core.model.Suffix}, and forward on to it's corresponding DAO
* class {@link SuffixDAO} for add/delete of suffix.
* <p>
* Class will throw {@link org.apache.directory.fortress.core.SecurityException} to caller in the event of security policy,
* data constraint violation or system error internal to DAO object. This class will forward DAO exceptions
* ({@link org.apache.directory.fortress.core.FinderException}, {@link org.apache.directory.fortress.core.CreateException},
* {@link org.apache.directory.fortress.core.UpdateException},{@link org.apache.directory.fortress.core.RemoveException}),
* or {@link org.apache.directory.fortress.core.ValidationException} as
* {@link org.apache.directory.fortress.core.SecurityException}s with appropriate error id from {@link GlobalErrIds}.
* <p style="font-size:2em; color:red;">
* The {@link #delete} method in this class is destructive as it will remove all nodes below the suffix using recursive
* delete function.<br>
* Extreme care should be taken during execution to ensure target dn is correct and permanent removal of data is intended.
* There is no 'undo' for this operation.
* <p>
* Simple error mapping is performed in {@link #validate} class.
* <p>
* This class is thread safe.
*
* @author <a href="mailto:dev@directory.apache.org">Apache Directory Project</a>
*/
public class SuffixP
{
private static final String CLS_NM = SuffixP.class.getName();
private static final Logger LOG = LoggerFactory.getLogger( CLS_NM );
/**
* Add a new suffix to the Directory Information Tree (DIT). After added the
* node will be listed in domain component format, i.e. dc=companyName, dc=com, or dc=orgName, dc=org.
*
* @param suffix contains the dc name and top level dc for target node.
* @throws org.apache.directory.fortress.core.SecurityException in event of validation or system error.
*/
public final void add( Suffix suffix )
throws SecurityException
{
validate( suffix );
SuffixDAO sDao = new SuffixDAO();
sDao.create( suffix );
}
/**
* Remove the suffix along with descendant nodes. This is a destructive method which will remove all DIT nodes under
* the specified.
* <p>
* <p style="font-size:2em; color:red;">
* This method is destructive and will remove all nodes below.<BR>
* Extreme care should be taken during execution to ensure target dn is correct and permanent removal of data is intended. There is no
* 'undo' for this operation.
*
* @param suffix contains the dc name and top level dc for target node.
* @throws SecurityException in event of validation or system error.
*/
public final void delete( Suffix suffix )
throws SecurityException
{
validate( suffix );
SuffixDAO sDao = new SuffixDAO();
sDao.remove( suffix );
}
/**
* Method will perform simple validations to ensure the integrity of the {@link Suffix} entity targeted for insertion
* or deletion in directory.
*
* @param entity contains the enum type to validate
* @throws org.apache.directory.fortress.core.SecurityException thrown in the event the attribute is null.
*/
private void validate( Suffix entity )
throws SecurityException
{
if ( entity.getName().length() > GlobalIds.OU_LEN )
{
String name = entity.getName();
String error = "validate name [" + name + "] invalid length [" + entity.getName().length() + "]";
LOG.warn( error );
throw new ValidationException( GlobalErrIds.SUFX_NAME_INVLD, error );
}
if ( StringUtils.isEmpty( entity.getName() ) )
{
String error = "validate name validation failed, null or empty value";
LOG.warn( error );
throw new ValidationException( GlobalErrIds.SUFX_NAME_NULL, error );
}
if ( entity.getDc().length() > GlobalIds.OU_LEN )
{
String name = entity.getName();
String error = "validate dc [" + name + "] invalid length [" + entity.getName().length() + "]";
LOG.warn( error );
throw new ValidationException( GlobalErrIds.SUFX_DCTOP_INVLD, error );
}
if ( StringUtils.isEmpty( entity.getDc() ) )
{
String error = "validate dc validation failed, null or empty value";
LOG.warn( error );
throw new ValidationException( GlobalErrIds.SUFX_DCTOP_NULL, error );
}
VUtil.safeText( entity.getDescription(), GlobalIds.DESC_LEN );
if ( StringUtils.isNotEmpty( entity.getDescription() ) )
{
VUtil.description( entity.getDescription() );
}
}
}