001 /*
002 * CDDL HEADER START
003 *
004 * The contents of this file are subject to the terms of the
005 * Common Development and Distribution License, Version 1.0 only
006 * (the "License"). You may not use this file except in compliance
007 * with the License.
008 *
009 * You can obtain a copy of the license at
010 * trunk/opends/resource/legal-notices/OpenDS.LICENSE
011 * or https://OpenDS.dev.java.net/OpenDS.LICENSE.
012 * See the License for the specific language governing permissions
013 * and limitations under the License.
014 *
015 * When distributing Covered Code, include this CDDL HEADER in each
016 * file and include the License file at
017 * trunk/opends/resource/legal-notices/OpenDS.LICENSE. If applicable,
018 * add the following below this CDDL HEADER, with the fields enclosed
019 * by brackets "[]" replaced with your own identifying information:
020 * Portions Copyright [yyyy] [name of copyright owner]
021 *
022 * CDDL HEADER END
023 *
024 *
025 * Copyright 2008 Sun Microsystems, Inc.
026 */
027 package org.opends.server.extensions;
028 import org.opends.messages.Message;
029
030
031
032 import java.util.LinkedHashSet;
033 import java.util.List;
034 import java.util.Set;
035
036 import org.opends.server.admin.server.ConfigurationChangeListener;
037 import org.opends.server.admin.std.server.UserDefinedVirtualAttributeCfg;
038 import org.opends.server.api.VirtualAttributeProvider;
039 import org.opends.server.config.ConfigException;
040 import org.opends.server.core.SearchOperation;
041 import org.opends.server.types.AttributeType;
042 import org.opends.server.types.AttributeValue;
043 import org.opends.server.types.ConfigChangeResult;
044 import org.opends.server.types.Entry;
045 import org.opends.server.types.InitializationException;
046 import org.opends.server.types.ResultCode;
047 import org.opends.server.types.VirtualAttributeRule;
048
049
050
051 /**
052 * This class implements a virtual attribute provider that allows administrators
053 * to define their own values that will be inserted into any entry that matches
054 * the criteria defined in the virtual attribute rule. This can be used to
055 * provide functionality like Class of Service (CoS) in the Sun Java System
056 * Directory Server.
057 */
058 public class UserDefinedVirtualAttributeProvider
059 extends VirtualAttributeProvider<UserDefinedVirtualAttributeCfg>
060 implements ConfigurationChangeListener<UserDefinedVirtualAttributeCfg>
061 {
062 // The current configuration for this virtual attribute provider.
063 private UserDefinedVirtualAttributeCfg currentConfig;
064
065
066
067 /**
068 * Creates a new instance of this member virtual attribute provider.
069 */
070 public UserDefinedVirtualAttributeProvider()
071 {
072 super();
073
074 // All initialization should be performed in the
075 // initializeVirtualAttributeProvider method.
076 }
077
078
079
080 /**
081 * {@inheritDoc}
082 */
083 @Override()
084 public void initializeVirtualAttributeProvider(
085 UserDefinedVirtualAttributeCfg configuration)
086 throws ConfigException, InitializationException
087 {
088 this.currentConfig = configuration;
089 configuration.addUserDefinedChangeListener(this);
090 }
091
092
093
094 /**
095 * {@inheritDoc}
096 */
097 @Override()
098 public void finalizeVirtualAttributeProvider()
099 {
100 currentConfig.removeUserDefinedChangeListener(this);
101 }
102
103
104
105 /**
106 * {@inheritDoc}
107 */
108 @Override()
109 public boolean isMultiValued()
110 {
111 if (currentConfig == null)
112 {
113 return true;
114 }
115 else
116 {
117 return (currentConfig.getValue().size() > 1);
118 }
119 }
120
121
122
123 /**
124 * {@inheritDoc}
125 */
126 @Override()
127 public LinkedHashSet<AttributeValue> getValues(Entry entry,
128 VirtualAttributeRule rule)
129 {
130 AttributeType attributeType = rule.getAttributeType();
131 Set<String> userDefinedValues = currentConfig.getValue();
132
133 LinkedHashSet<AttributeValue> values =
134 new LinkedHashSet<AttributeValue>(userDefinedValues.size());
135 for (String valueString : userDefinedValues)
136 {
137 values.add(new AttributeValue(attributeType, valueString));
138 }
139
140 return values;
141 }
142
143
144
145 /**
146 * {@inheritDoc}
147 */
148 @Override()
149 public boolean isSearchable(VirtualAttributeRule rule,
150 SearchOperation searchOperation)
151 {
152 // We will not allow searches based only on user-defined virtual attributes.
153 return false;
154 }
155
156
157
158 /**
159 * {@inheritDoc}
160 */
161 @Override()
162 public void processSearch(VirtualAttributeRule rule,
163 SearchOperation searchOperation)
164 {
165 searchOperation.setResultCode(ResultCode.UNWILLING_TO_PERFORM);
166 return;
167 }
168
169
170
171 /**
172 * {@inheritDoc}
173 */
174 public boolean isConfigurationChangeAcceptable(
175 UserDefinedVirtualAttributeCfg configuration,
176 List<Message> unacceptableReasons)
177 {
178 // The new configuration should always be acceptable.
179 return true;
180 }
181
182
183
184 /**
185 * {@inheritDoc}
186 */
187 public ConfigChangeResult applyConfigurationChange(
188 UserDefinedVirtualAttributeCfg configuration)
189 {
190 // Just accept the new configuration as-is.
191 currentConfig = configuration;
192
193 return new ConfigChangeResult(ResultCode.SUCCESS, false);
194 }
195 }
196