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 2006-2008 Sun Microsystems, Inc.
026     */
027    package org.opends.server.extensions;
028    
029    
030    
031    import java.util.LinkedHashSet;
032    import java.util.List;
033    
034    import org.opends.messages.Message;
035    import org.opends.server.admin.std.server.SubschemaSubentryVirtualAttributeCfg;
036    import org.opends.server.api.VirtualAttributeProvider;
037    import org.opends.server.config.ConfigException;
038    import org.opends.server.core.DirectoryServer;
039    import org.opends.server.core.SearchOperation;
040    import org.opends.server.loggers.debug.DebugTracer;
041    import org.opends.server.types.AttributeValue;
042    import org.opends.server.types.ByteString;
043    import org.opends.server.types.ConditionResult;
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    import static org.opends.server.loggers.debug.DebugLogger.*;
050    import static org.opends.messages.ExtensionMessages.*;
051    import static org.opends.server.util.ServerConstants.*;
052    
053    
054    
055    /**
056     * This class implements a virtual attribute provider that is meant to serve the
057     * subschemaSubentry operational attribute as described in RFC 4512.
058     */
059    public class SubschemaSubentryVirtualAttributeProvider
060           extends VirtualAttributeProvider<SubschemaSubentryVirtualAttributeCfg>
061    {
062      /**
063       * The tracer object for the debug logger.
064       */
065      private static final DebugTracer TRACER = getTracer();
066    
067    
068    
069      /**
070       * Creates a new instance of this subschemaSubentry virtual attribute
071       * provider.
072       */
073      public SubschemaSubentryVirtualAttributeProvider()
074      {
075        super();
076    
077        // All initialization should be performed in the
078        // initializeVirtualAttributeProvider method.
079      }
080    
081    
082    
083      /**
084       * {@inheritDoc}
085       */
086      @Override()
087      public void initializeVirtualAttributeProvider(
088                                SubschemaSubentryVirtualAttributeCfg configuration)
089             throws ConfigException, InitializationException
090      {
091        // No initialization is required.
092      }
093    
094    
095    
096      /**
097       * {@inheritDoc}
098       */
099      @Override()
100      public boolean isMultiValued()
101      {
102        return false;
103      }
104    
105    
106    
107      /**
108       * {@inheritDoc}
109       */
110      @Override()
111      public LinkedHashSet<AttributeValue> getValues(Entry entry,
112                                                     VirtualAttributeRule rule)
113      {
114        LinkedHashSet<AttributeValue> values = new LinkedHashSet<AttributeValue>(1);
115    
116        values.add(new AttributeValue(rule.getAttributeType(),
117                                      DirectoryServer.getSchemaDN().toString()));
118    
119        return values;
120      }
121    
122    
123    
124      /**
125       * {@inheritDoc}
126       */
127      @Override()
128      public ConditionResult matchesSubstring(Entry entry,
129                                              VirtualAttributeRule rule,
130                                              ByteString subInitial,
131                                              List<ByteString> subAny,
132                                              ByteString subFinal)
133      {
134        // DNs cannot be used in substring matching.
135        return ConditionResult.UNDEFINED;
136      }
137    
138    
139    
140      /**
141       * {@inheritDoc}
142       */
143      @Override()
144      public ConditionResult greaterThanOrEqualTo(Entry entry,
145                                  VirtualAttributeRule rule,
146                                  AttributeValue value)
147      {
148        // DNs cannot be used in ordering matching.
149        return ConditionResult.UNDEFINED;
150      }
151    
152    
153    
154      /**
155       * {@inheritDoc}
156       */
157      @Override()
158      public ConditionResult lessThanOrEqualTo(Entry entry,
159                                  VirtualAttributeRule rule,
160                                  AttributeValue value)
161      {
162        // DNs cannot be used in ordering matching.
163        return ConditionResult.UNDEFINED;
164      }
165    
166    
167    
168      /**
169       * {@inheritDoc}
170       */
171      @Override()
172      public ConditionResult approximatelyEqualTo(Entry entry,
173                                  VirtualAttributeRule rule,
174                                  AttributeValue value)
175      {
176        // DNs cannot be used in approximate matching.
177        return ConditionResult.UNDEFINED;
178      }
179    
180    
181    
182      /**
183       * {@inheritDoc}.  This virtual attribute will support search operations only
184       * if one of the following is true about the search filter:
185       * <UL>
186       *   <LI>It is an equality filter targeting the associated attribute
187       *       type.</LI>
188       *   <LI>It is an AND filter in which at least one of the components is an
189       *       equality filter targeting the associated attribute type.</LI>
190       *   <LI>It is an OR filter in which all of the components are equality
191       *       filters targeting the associated attribute type.</LI>
192       * </UL>
193       */
194      @Override()
195      public boolean isSearchable(VirtualAttributeRule rule,
196                                  SearchOperation searchOperation)
197      {
198        // This attribute is not searchable, since it will have the same value in
199        // tons of entries.
200        return false;
201      }
202    
203    
204    
205      /**
206       * {@inheritDoc}
207       */
208      @Override()
209      public void processSearch(VirtualAttributeRule rule,
210                                SearchOperation searchOperation)
211      {
212        searchOperation.setResultCode(ResultCode.UNWILLING_TO_PERFORM);
213    
214        Message message = ERR_SUBSCHEMASUBENTRY_VATTR_NOT_SEARCHABLE.get(
215                rule.getAttributeType().getNameOrOID());
216        searchOperation.appendErrorMessage(message);
217      }
218    }
219