001: /* SetupLdapFixtureOperation.java
002: *
003: * DDSteps - Data Driven JUnit Test Steps
004: * Copyright (C) 2005 Jayway AB
005: * www.ddsteps.org
006: *
007: * This library is free software; you can redistribute it and/or
008: * modify it under the terms of the GNU Lesser General Public
009: * License version 2.1 as published by the Free Software Foundation.
010: *
011: * This library is distributed in the hope that it will be useful,
012: * but WITHOUT ANY WARRANTY; without even the implied warranty of
013: * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
014: * Lesser General Public License for more details.
015: *
016: * You should have received a copy of the GNU Lesser General Public
017: * License along with this library; if not, visit
018: * http://www.opensource.org/licenses/lgpl-license.php
019: */
020:
021: package org.ddsteps.fixture.ldap.support;
022:
023: import java.util.Iterator;
024:
025: import net.sf.ldaptemplate.BadLdapGrammarException;
026: import net.sf.ldaptemplate.LdapOperations;
027: import net.sf.ldaptemplate.support.DirContextAdapter;
028: import net.sf.ldaptemplate.support.DirContextOperations;
029: import net.sf.ldaptemplate.support.DistinguishedName;
030:
031: import org.apache.commons.lang.ArrayUtils;
032: import org.apache.commons.lang.ClassUtils;
033: import org.apache.commons.lang.StringUtils;
034: import org.apache.commons.logging.Log;
035: import org.apache.commons.logging.LogFactory;
036: import org.ddsteps.dataset.DataRow;
037: import org.ddsteps.dataset.DataValue;
038: import org.springframework.dao.DataIntegrityViolationException;
039:
040: /**
041: * LdapFixtureOperation to add rows to LDAP. A value may be of any data type,
042: * but if it is a String which contains linebreaks, each line in that value will
043: * be interpreted as a separate attribute value.
044: *
045: * Note that array values only work for String arrays, due to missing functions
046: * in DirContextOperations.
047: *
048: * @author Mattias Arthursson
049: *
050: */
051: public class SetupLdapFixtureOperation extends
052: AbstractLdapFixtureOperation {
053:
054: private static Log log = LogFactory
055: .getLog(TeardownLdapFixtureOperation.class);
056:
057: /**
058: *
059: *
060: * @see org.ddsteps.fixture.ldap.support.LdapFixtureOperation#handleRow(net.sf.ldaptemplate.LdapOperations,
061: * org.ddsteps.dataset.DataRow)
062: */
063: public void handleRow(LdapOperations ldapOperations, DataRow dataRow) {
064: DistinguishedName dn = null;
065: DirContextOperations dirContextOperations = getDirContextOperationsInstance();
066:
067: for (Iterator iter = dataRow.iterator(); iter.hasNext();) {
068: DataValue dataValue = (DataValue) iter.next();
069:
070: String name = dataValue.getName();
071: Object value = dataValue.getValue();
072: if (value == null) {
073: continue;
074: }
075: value = transformArrayValue(value);
076: if (StringUtils.equals(name, getDnColumnName())) {
077: if (value instanceof String) {
078: dn = new DistinguishedName((String) value);
079: } else {
080: throw new BadLdapGrammarException(
081: "Invalid Distinguished Name: "
082: + "Must be a valid LDAP DN but was :"
083: + value);
084: }
085: } else {
086: if (value instanceof Object[]) {
087: dirContextOperations.setAttributeValues(name,
088: (Object[]) value);
089: } else {
090: dirContextOperations.setAttributeValue(name, value);
091: }
092: }
093: }
094:
095: if (dn == null) {
096: throw new DataIntegrityViolationException(
097: "A Distinguished Name must be supplied in column '"
098: + getDnColumnName() + "'");
099: }
100: log.info("Binding DN " + dn);
101: try {
102: ldapOperations.bind(dn, dirContextOperations, null);
103: } catch (Exception e) {
104: // TODO: handle exception
105: }
106: }
107:
108: /**
109: * If the supplied value is a newline-separated String, each row of the
110: * String is interpreted as a separate Attribute value and this method
111: * returns an array corresponding to the split String.
112: *
113: * @param o
114: * @return
115: */
116: private Object transformArrayValue(Object o) {
117: if (o instanceof String[]) {
118: return o;
119: } else if (o instanceof String) {
120: String string = (String) o;
121: if (StringUtils.contains(string, "\n")) {
122: return StringUtils.split(string, "\n");
123: } else {
124: return string;
125: }
126: } else {
127: return o;
128: }
129: }
130:
131: /**
132: * Factory method for DirContextOperations. To be overridden in test case.
133: *
134: * @return a new DirContextAdapter instance.
135: */
136: DirContextOperations getDirContextOperationsInstance() {
137: return new DirContextAdapter();
138: }
139:
140: }
|