001    /*
002     *  Licensed to the Apache Software Foundation (ASF) under one
003     *  or more contributor license agreements.  See the NOTICE file
004     *  distributed with this work for additional information
005     *  regarding copyright ownership.  The ASF licenses this file
006     *  to you under the Apache License, Version 2.0 (the
007     *  "License"); you may not use this file except in compliance
008     *  with the License.  You may obtain a copy of the License at
009     *  
010     *    http://www.apache.org/licenses/LICENSE-2.0
011     *  
012     *  Unless required by applicable law or agreed to in writing,
013     *  software distributed under the License is distributed on an
014     *  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
015     *  KIND, either express or implied.  See the License for the
016     *  specific language governing permissions and limitations
017     *  under the License. 
018     *  
019     */
020    package org.apache.directory.server.utils; 
021    
022    
023    import java.util.List;
024    
025    import org.apache.directory.server.i18n.I18n;
026    import org.apache.directory.shared.ldap.constants.MetaSchemaConstants;
027    import org.apache.directory.shared.ldap.constants.SchemaConstants;
028    import org.apache.directory.shared.ldap.entry.DefaultServerAttribute;
029    import org.apache.directory.shared.ldap.entry.DefaultServerEntry;
030    import org.apache.directory.shared.ldap.entry.EntryAttribute;
031    import org.apache.directory.shared.ldap.entry.ServerEntry;
032    import org.apache.directory.shared.ldap.exception.LdapException;
033    import org.apache.directory.shared.ldap.schema.AttributeType;
034    import org.apache.directory.shared.ldap.schema.DITContentRule;
035    import org.apache.directory.shared.ldap.schema.DITStructureRule;
036    import org.apache.directory.shared.ldap.schema.LdapComparator;
037    import org.apache.directory.shared.ldap.schema.LdapSyntax;
038    import org.apache.directory.shared.ldap.schema.MatchingRule;
039    import org.apache.directory.shared.ldap.schema.MatchingRuleUse;
040    import org.apache.directory.shared.ldap.schema.NameForm;
041    import org.apache.directory.shared.ldap.schema.Normalizer;
042    import org.apache.directory.shared.ldap.schema.ObjectClass;
043    import org.apache.directory.shared.ldap.schema.SchemaManager;
044    import org.apache.directory.shared.ldap.schema.SchemaObject;
045    import org.apache.directory.shared.ldap.schema.SyntaxChecker;
046    import org.apache.directory.shared.ldap.schema.registries.Schema;
047    import org.apache.directory.shared.ldap.util.DateUtils;
048    
049    
050    /**
051     * A factory that generates an entry using the meta schema for schema 
052     * elements.
053     *
054     * @author <a href="mailto:dev@directory.apache.org">Apache Directory Project</a>
055     * @version $Rev$
056     */
057    public class AttributesFactory
058    {
059        public ServerEntry getAttributes( SchemaObject obj, Schema schema, SchemaManager schemaManager ) throws LdapException
060        {
061            if ( obj instanceof LdapSyntax )
062            {
063                return getAttributes( ( LdapSyntax ) obj, schema, schemaManager );
064            }
065            else if ( obj instanceof MatchingRule )
066            {
067                return getAttributes( ( MatchingRule ) obj, schema, schemaManager );
068            }
069            else if ( obj instanceof AttributeType )
070            {
071                return getAttributes( ( AttributeType ) obj, schema, schemaManager );
072            }
073            else if ( obj instanceof ObjectClass )
074            {
075                return getAttributes( ( ObjectClass ) obj, schema, schemaManager );
076            }
077            else if ( obj instanceof MatchingRuleUse )
078            {
079                return getAttributes( ( MatchingRuleUse ) obj, schema, schemaManager );
080            }
081            else if ( obj instanceof DITStructureRule )
082            {
083                return getAttributes( ( DITStructureRule ) obj, schema, schemaManager );
084            }
085            else if ( obj instanceof DITContentRule )
086            {
087                return getAttributes( ( DITContentRule ) obj, schema, schemaManager );
088            }
089            else if ( obj instanceof NameForm )
090            {
091                return getAttributes( ( NameForm ) obj, schema, schemaManager );
092            }
093            
094            throw new IllegalArgumentException( I18n.err( I18n.ERR_698, obj.getClass() ) );
095        }
096        
097        
098        public ServerEntry getAttributes( Schema schema, SchemaManager schemaManager ) throws LdapException
099        {
100            ServerEntry entry = new DefaultServerEntry( schemaManager );
101    
102            entry.put( SchemaConstants.OBJECT_CLASS_AT, SchemaConstants.TOP_OC, MetaSchemaConstants.META_SCHEMA_OC );
103            entry.put( SchemaConstants.CN_AT, schema.getSchemaName() );
104            entry.put( SchemaConstants.CREATORS_NAME_AT, schema.getOwner() );
105            entry.put( SchemaConstants.CREATE_TIMESTAMP_AT, DateUtils.getGeneralizedTime() );
106            
107            if ( schema.isDisabled() )
108            {
109                entry.put( MetaSchemaConstants.M_DISABLED_AT, "TRUE" );
110            }
111            
112            String[] dependencies = schema.getDependencies();
113            
114            if ( dependencies != null && dependencies.length > 0 )
115            {
116                EntryAttribute attr = new DefaultServerAttribute( schemaManager.lookupAttributeTypeRegistry( MetaSchemaConstants.M_DEPENDENCIES_AT ) );
117                
118                for ( String dependency:dependencies )
119                {
120                    attr.add( dependency );
121                }
122                
123                entry.put( attr );
124            }
125            
126            return entry;
127        }
128        
129        
130        public ServerEntry getAttributes( SyntaxChecker syntaxChecker, Schema schema, SchemaManager schemaManager )
131        {
132            ServerEntry entry = new DefaultServerEntry( schemaManager );
133    
134            entry.put( SchemaConstants.OBJECT_CLASS_AT, SchemaConstants.TOP_OC, MetaSchemaConstants.META_SYNTAX_CHECKER_OC );
135            entry.put( MetaSchemaConstants.M_OID_AT, syntaxChecker.getOid() );
136            entry.put( MetaSchemaConstants.M_FQCN_AT, syntaxChecker.getClass().getName() );
137            entry.put( SchemaConstants.CREATORS_NAME_AT, schema.getOwner() );
138            entry.put( SchemaConstants.CREATE_TIMESTAMP_AT, DateUtils.getGeneralizedTime() );
139            
140            return entry;
141        }
142    
143        
144        public ServerEntry getAttributes( LdapSyntax syntax, Schema schema, SchemaManager schemaManager ) throws LdapException
145        {
146            ServerEntry entry = new DefaultServerEntry( schemaManager );
147    
148            entry.put( SchemaConstants.OBJECT_CLASS_AT, SchemaConstants.TOP_OC, MetaSchemaConstants.META_SYNTAX_OC );
149            entry.put( MetaSchemaConstants.X_HUMAN_READABLE_AT, getBoolean( syntax.isHumanReadable() ) );
150            entry.put( SchemaConstants.CREATORS_NAME_AT, schema.getOwner() );
151            entry.put( SchemaConstants.CREATE_TIMESTAMP_AT, DateUtils.getGeneralizedTime() );
152            injectCommon( syntax, entry, schemaManager );
153            
154            return entry;
155        }
156    
157        
158        public ServerEntry getAttributes( String oid, Normalizer normalizer, Schema schema, SchemaManager schemaManager )
159        {
160            ServerEntry entry = new DefaultServerEntry( schemaManager );
161    
162            entry.put( SchemaConstants.OBJECT_CLASS_AT, SchemaConstants.TOP_OC, MetaSchemaConstants.META_NORMALIZER_OC );
163            entry.put( MetaSchemaConstants.M_OID_AT, oid );
164            entry.put( MetaSchemaConstants.M_FQCN_AT, normalizer.getClass().getName() );
165            entry.put( SchemaConstants.CREATORS_NAME_AT, schema.getOwner() );
166            entry.put( SchemaConstants.CREATE_TIMESTAMP_AT, DateUtils.getGeneralizedTime() );
167            return entry;
168        }
169    
170        
171        public ServerEntry getAttributes( String oid, LdapComparator<? super Object> comparator, Schema schema, SchemaManager schemaManager )
172        {
173            ServerEntry entry = new DefaultServerEntry( schemaManager );
174    
175            entry.put( SchemaConstants.OBJECT_CLASS_AT, SchemaConstants.TOP_OC, MetaSchemaConstants.META_COMPARATOR_OC );
176            entry.put( MetaSchemaConstants.M_OID_AT, oid );
177            entry.put( MetaSchemaConstants.M_FQCN_AT, comparator.getClass().getName() );
178            entry.put( SchemaConstants.CREATORS_NAME_AT, schema.getOwner() );
179            entry.put( SchemaConstants.CREATE_TIMESTAMP_AT, DateUtils.getGeneralizedTime() );
180            return entry;
181        }
182    
183    
184        /**
185         * 
186         * @param matchingRule
187         * @return Attributes
188         * @throws LdapException
189         */
190        public ServerEntry getAttributes( MatchingRule matchingRule, Schema schema, SchemaManager schemaManager ) throws LdapException
191        {
192            ServerEntry entry = new DefaultServerEntry( schemaManager );
193    
194            entry.put( SchemaConstants.OBJECT_CLASS_AT, SchemaConstants.TOP_OC, MetaSchemaConstants.META_MATCHING_RULE_OC );
195            entry.put( MetaSchemaConstants.M_SYNTAX_AT, matchingRule.getSyntaxOid() );
196            entry.put( SchemaConstants.CREATORS_NAME_AT, schema.getOwner() );
197            entry.put( SchemaConstants.CREATE_TIMESTAMP_AT, DateUtils.getGeneralizedTime() );
198            injectCommon( matchingRule, entry, schemaManager );
199            return entry;
200        }
201    
202        
203        public ServerEntry getAttributes( MatchingRuleUse matchingRuleUse, Schema schema, SchemaManager schemaManager )
204        {
205            ServerEntry entry = new DefaultServerEntry( schemaManager );
206    
207            entry.put( SchemaConstants.OBJECT_CLASS_AT, SchemaConstants.TOP_OC, "" );
208            entry.put( SchemaConstants.CREATORS_NAME_AT, schema.getOwner() );
209            entry.put( SchemaConstants.CREATE_TIMESTAMP_AT, DateUtils.getGeneralizedTime() );
210            return entry;
211        }
212    
213        
214        public ServerEntry getAttributes( DITStructureRule dITStructureRule, Schema schema, SchemaManager schemaManager )
215        {
216            ServerEntry entry = new DefaultServerEntry( schemaManager );
217    
218            entry.put( SchemaConstants.OBJECT_CLASS_AT, SchemaConstants.TOP_OC, "" );
219            entry.put( SchemaConstants.CREATORS_NAME_AT, schema.getOwner() );
220            entry.put( SchemaConstants.CREATE_TIMESTAMP_AT, DateUtils.getGeneralizedTime() );
221            return entry;
222        }
223    
224        
225        public ServerEntry getAttributes( DITContentRule dITContentRule, Schema schema, SchemaManager schemaManager )
226        {
227            ServerEntry entry = new DefaultServerEntry( schemaManager );
228    
229            entry.put( SchemaConstants.OBJECT_CLASS_AT, SchemaConstants.TOP_OC, "" );
230            entry.put( SchemaConstants.CREATORS_NAME_AT, schema.getOwner() );
231            entry.put( SchemaConstants.CREATE_TIMESTAMP_AT, DateUtils.getGeneralizedTime() );
232            return entry;
233        }
234    
235        
236        public ServerEntry getAttributes( NameForm nameForm, Schema schema, SchemaManager schemaManager )
237        {
238            ServerEntry entry = new DefaultServerEntry( schemaManager );
239    
240            entry.put( SchemaConstants.OBJECT_CLASS_AT, SchemaConstants.TOP_OC, "" );
241            entry.put( SchemaConstants.CREATORS_NAME_AT, schema.getOwner() );
242            entry.put( SchemaConstants.CREATE_TIMESTAMP_AT, DateUtils.getGeneralizedTime() );
243            return entry;
244        }
245    
246    
247        /**
248         * <pre>
249         *    objectclass ( 1.3.6.1.4.1.18060.0.4.0.3.3
250         *       NAME 'metaAttributeType'
251         *       DESC 'meta definition of the AttributeType object'
252         *       SUP metaTop
253         *       STRUCTURAL
254         *       MUST ( m-name $ m-syntax )
255         *       MAY ( m-supAttributeType $ m-obsolete $ m-equality $ m-ordering $ 
256         *             m-substr $ m-singleValue $ m-collective $ m-noUserModification $ 
257         *             m-usage $ m-extensionAttributeType )
258         *    )
259         * </pre>
260         * 
261         * @param attributeType
262         * @return Attributes
263         * @throws LdapException
264         */
265        public ServerEntry getAttributes( AttributeType attributeType, Schema schema, SchemaManager schemaManager ) throws LdapException
266        {
267            ServerEntry entry = new DefaultServerEntry( schemaManager );
268    
269            entry.put( SchemaConstants.OBJECT_CLASS_AT, SchemaConstants.TOP_OC, MetaSchemaConstants.META_ATTRIBUTE_TYPE_OC );
270            entry.put( MetaSchemaConstants.M_SYNTAX_AT, attributeType.getSyntaxOid() );
271            entry.put( MetaSchemaConstants.M_COLLECTIVE_AT, getBoolean( attributeType.isCollective() ) );
272            entry.put( MetaSchemaConstants.M_NO_USER_MODIFICATION_AT, getBoolean( ! attributeType.isUserModifiable() ) );
273            entry.put( MetaSchemaConstants.M_SINGLE_VALUE_AT, getBoolean( attributeType.isSingleValued() ) );
274            entry.put( MetaSchemaConstants.M_USAGE_AT, attributeType.getUsage().toString() );
275            entry.put( SchemaConstants.CREATORS_NAME_AT, schema.getOwner() );
276            entry.put( SchemaConstants.CREATE_TIMESTAMP_AT, DateUtils.getGeneralizedTime() );
277    
278            injectCommon( attributeType, entry, schemaManager );
279            
280            String superiorOid = attributeType.getSuperiorOid();
281            
282            if ( superiorOid != null )
283            {
284                entry.put( MetaSchemaConstants.M_SUP_ATTRIBUTE_TYPE_AT, superiorOid );
285            }
286            
287            if ( attributeType.getEqualityOid() != null )
288            {
289                entry.put( MetaSchemaConstants.M_EQUALITY_AT, attributeType.getEqualityOid() );
290            }
291    
292            if ( attributeType.getSubstringOid() != null )
293            {
294                entry.put( MetaSchemaConstants.M_SUBSTR_AT, attributeType.getSubstringOid() );
295            }
296    
297            if ( attributeType.getOrderingOid() != null )
298            {
299                entry.put( MetaSchemaConstants.M_ORDERING_AT, attributeType.getOrderingOid() );
300            }
301    
302            return entry;
303        }
304    
305        
306        /**
307         * Creates the attributes of an entry representing an objectClass.
308         * 
309         * <pre>
310         *  objectclass ( 1.3.6.1.4.1.18060.0.4.0.3.2
311         *      NAME 'metaObjectClass'
312         *      DESC 'meta definition of the objectclass object'
313         *      SUP metaTop
314         *      STRUCTURAL
315         *      MUST m-oid
316         *      MAY ( m-name $ m-obsolete $ m-supObjectClass $ m-typeObjectClass $ m-must $ 
317         *            m-may $ m-extensionObjectClass )
318         *  )
319         * </pre>
320         * 
321         * @param objectClass the objectClass to produce a meta schema entry for
322         * @return the attributes of the metaSchema entry representing the objectClass
323         * @throws LdapException if there are any problems
324         */
325        public ServerEntry getAttributes( ObjectClass objectClass, Schema schema, SchemaManager schemaManager ) throws LdapException
326        {
327            ServerEntry entry = new DefaultServerEntry( schemaManager );
328    
329            entry.put( SchemaConstants.OBJECT_CLASS_AT, SchemaConstants.TOP_OC, MetaSchemaConstants.META_OBJECT_CLASS_OC );
330            entry.put( MetaSchemaConstants.M_TYPE_OBJECT_CLASS_AT, objectClass.getType().toString() );
331            entry.put( SchemaConstants.CREATORS_NAME_AT, schema.getOwner() );
332            entry.put( SchemaConstants.CREATE_TIMESTAMP_AT, DateUtils.getGeneralizedTime() );
333            
334            injectCommon( objectClass, entry, schemaManager );
335    
336            // handle the superior objectClasses 
337            if ( objectClass.getSuperiorOids() != null && objectClass.getSuperiorOids().size() != 0 )
338            {
339                EntryAttribute attr = new DefaultServerAttribute( schemaManager.lookupAttributeTypeRegistry( MetaSchemaConstants.M_SUP_OBJECT_CLASS_AT ) );
340                
341                for ( String superior:objectClass.getSuperiorOids() )
342                {
343                    attr.add( superior ); 
344                }
345                
346                entry.put( attr );
347            }
348    
349            // add the must list
350            if ( objectClass.getMustAttributeTypeOids() != null && objectClass.getMustAttributeTypeOids().size() != 0 )
351            {
352                EntryAttribute attr = new DefaultServerAttribute( schemaManager.lookupAttributeTypeRegistry( MetaSchemaConstants.M_MUST_AT ) );
353    
354                for ( String mustOid :objectClass.getMustAttributeTypeOids() )
355                {
356                    attr.add( mustOid );
357                }
358                
359                entry.put( attr );
360            }
361            
362            // add the may list
363            if ( objectClass.getMayAttributeTypeOids() != null && objectClass.getMayAttributeTypeOids().size() != 0 )
364            {
365                EntryAttribute attr = new DefaultServerAttribute( schemaManager.lookupAttributeTypeRegistry( MetaSchemaConstants.M_MAY_AT ) );
366    
367                for ( String mayOid :objectClass.getMayAttributeTypeOids() )
368                {
369                    attr.add( mayOid );
370                }
371                
372                entry.put( attr );
373            }
374            
375            return entry;
376        }
377        
378        
379        private final void injectCommon( SchemaObject object, ServerEntry entry, SchemaManager schemaManager ) throws LdapException
380        {
381            injectNames( object.getNames(), entry, schemaManager );
382            entry.put( MetaSchemaConstants.M_OBSOLETE_AT, getBoolean( object.isObsolete() ) );
383            entry.put( MetaSchemaConstants.M_OID_AT, object.getOid() );
384            
385            if ( object.getDescription() != null )
386            {
387                entry.put( MetaSchemaConstants.M_DESCRIPTION_AT, object.getDescription() );
388            }
389        }
390        
391        
392        private final void injectNames( List<String> names, ServerEntry entry, SchemaManager schemaManager ) throws LdapException
393        {
394            if ( ( names == null ) || ( names.size() == 0 ) )
395            {
396                return;
397            }
398            
399            EntryAttribute attr = new DefaultServerAttribute( schemaManager.lookupAttributeTypeRegistry( MetaSchemaConstants.M_NAME_AT ) );
400    
401            for ( String name:names )
402            {
403                attr.add( name );
404            }
405            
406            entry.put( attr );
407        }
408    
409        
410        private final String getBoolean( boolean value )
411        {
412            if ( value ) 
413            {
414                return "TRUE";
415            }
416            else
417            {
418                return "FALSE";
419            }
420        }
421    }