You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@directory.apache.org by go...@apache.org on 2011/11/17 16:21:40 UTC
svn commit: r1203217 - in /directory/apacheds/trunk: ./ component-hub/
component-hub/src/ component-hub/src/main/ component-hub/src/main/java/
component-hub/src/main/java/org/ component-hub/src/main/java/org/apache/
component-hub/src/main/java/org/apac...
Author: gokturk
Date: Thu Nov 17 15:21:39 2011
New Revision: 1203217
URL: http://svn.apache.org/viewvc?rev=1203217&view=rev
Log:
First work on ApacheDS ComponentHub ( the IPojo based main plug-in layer).
TODO:
* Implement ComponentManager for ComponentHub's clients to manage component instances,schema and configuration
* Implement entry cache to preserve component instance configuration across server sessions.
* Add test cases for "customuser" typed components.
......
* Create InterceptorHubClient to manage interceptors using plug-in layer.
Added:
directory/apacheds/trunk/component-hub/
directory/apacheds/trunk/component-hub/pom.xml
directory/apacheds/trunk/component-hub/src/
directory/apacheds/trunk/component-hub/src/main/
directory/apacheds/trunk/component-hub/src/main/java/
directory/apacheds/trunk/component-hub/src/main/java/org/
directory/apacheds/trunk/component-hub/src/main/java/org/apache/
directory/apacheds/trunk/component-hub/src/main/java/org/apache/directory/
directory/apacheds/trunk/component-hub/src/main/java/org/apache/directory/server/
directory/apacheds/trunk/component-hub/src/main/java/org/apache/directory/server/component/
directory/apacheds/trunk/component-hub/src/main/java/org/apache/directory/server/component/ADSComponent.java
directory/apacheds/trunk/component-hub/src/main/java/org/apache/directory/server/component/ADSComponentInstance.java
directory/apacheds/trunk/component-hub/src/main/java/org/apache/directory/server/component/ADSConstants.java
directory/apacheds/trunk/component-hub/src/main/java/org/apache/directory/server/component/handler/
directory/apacheds/trunk/component-hub/src/main/java/org/apache/directory/server/component/handler/ADSComponent.java
directory/apacheds/trunk/component-hub/src/main/java/org/apache/directory/server/component/handler/ADSComponentHandler.java
directory/apacheds/trunk/component-hub/src/main/java/org/apache/directory/server/component/hub/
directory/apacheds/trunk/component-hub/src/main/java/org/apache/directory/server/component/hub/ComponentHub.java
directory/apacheds/trunk/component-hub/src/main/java/org/apache/directory/server/component/hub/listener/
directory/apacheds/trunk/component-hub/src/main/java/org/apache/directory/server/component/hub/listener/AbstractHubListener.java
directory/apacheds/trunk/component-hub/src/main/java/org/apache/directory/server/component/hub/listener/HubListener.java
directory/apacheds/trunk/component-hub/src/main/java/org/apache/directory/server/component/schema/
directory/apacheds/trunk/component-hub/src/main/java/org/apache/directory/server/component/schema/ADSComponentSchema.java
directory/apacheds/trunk/component-hub/src/main/java/org/apache/directory/server/component/schema/ComponentOIDGenerator.java
directory/apacheds/trunk/component-hub/src/main/java/org/apache/directory/server/component/schema/ComponentSchemaGenerator.java
directory/apacheds/trunk/component-hub/src/main/java/org/apache/directory/server/component/schema/UserComponentSchemaGenerator.java
Modified:
directory/apacheds/trunk/pom.xml
Added: directory/apacheds/trunk/component-hub/pom.xml
URL: http://svn.apache.org/viewvc/directory/apacheds/trunk/component-hub/pom.xml?rev=1203217&view=auto
==============================================================================
--- directory/apacheds/trunk/component-hub/pom.xml (added)
+++ directory/apacheds/trunk/component-hub/pom.xml Thu Nov 17 15:21:39 2011
@@ -0,0 +1,97 @@
+<?xml version="1.0" encoding="UTF-8"?>
+
+<!--
+ 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.
+-->
+
+<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
+ <modelVersion>4.0.0</modelVersion>
+ <parent>
+ <groupId>org.apache.directory.server</groupId>
+ <artifactId>apacheds-parent</artifactId>
+ <version>2.0.0-M4-SNAPSHOT</version>
+ </parent>
+
+ <artifactId>apacheds-component-hub</artifactId>
+ <name>ApacheDS Component Hub</name>
+ <packaging>bundle</packaging>
+ <description>Provides main plugin-layer for ApacheDS</description>
+
+ <dependencies>
+
+ <dependency>
+ <groupId>org.apache.directory.server</groupId>
+ <artifactId>apacheds-core-api</artifactId>
+ </dependency>
+
+ <dependency>
+ <groupId>org.apache.directory.shared</groupId>
+ <artifactId>shared-ldap-model</artifactId>
+ </dependency>
+
+ <dependency>
+ <groupId>org.apache.felix</groupId>
+ <artifactId>org.apache.felix.ipojo.annotations</artifactId>
+ <version>1.8.0</version>
+ </dependency>
+
+ <dependency>
+ <groupId>org.apache.felix</groupId>
+ <artifactId>org.apache.felix.ipojo.handler.whiteboard</artifactId>
+ <version>1.6.0</version>
+ </dependency>
+
+ <dependency>
+ <groupId>org.osgi</groupId>
+ <artifactId>org.osgi.core</artifactId>
+ <version>4.3.0</version>
+ </dependency>
+
+ </dependencies>
+
+ <build>
+ <plugins>
+ <plugin>
+ <groupId>org.apache.felix</groupId>
+ <artifactId>maven-bundle-plugin</artifactId>
+ <inherited>true</inherited>
+ <extensions>true</extensions>
+ <configuration>
+ <manifestLocation>META-INF</manifestLocation>
+ <instructions>
+ <Bundle-SymbolicName>${project.groupId}.component.hub</Bundle-SymbolicName>
+ </instructions>
+ </configuration>
+ </plugin>
+
+ <plugin>
+ <groupId>org.apache.felix</groupId>
+ <artifactId>maven-ipojo-plugin</artifactId>
+ <version>1.8.0</version>
+ <executions>
+ <execution>
+ <goals>
+ <goal>ipojo-bundle</goal>
+ </goals>
+ </execution>
+ </executions>
+ </plugin>
+ </plugins>
+ </build>
+</project>
+
Added: directory/apacheds/trunk/component-hub/src/main/java/org/apache/directory/server/component/ADSComponent.java
URL: http://svn.apache.org/viewvc/directory/apacheds/trunk/component-hub/src/main/java/org/apache/directory/server/component/ADSComponent.java?rev=1203217&view=auto
==============================================================================
--- directory/apacheds/trunk/component-hub/src/main/java/org/apache/directory/server/component/ADSComponent.java (added)
+++ directory/apacheds/trunk/component-hub/src/main/java/org/apache/directory/server/component/ADSComponent.java Thu Nov 17 15:21:39 2011
@@ -0,0 +1,49 @@
+/*
+ * 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.server.component;
+
+import java.util.List;
+
+import org.apache.directory.shared.ldap.model.ldif.LdifReader;
+import org.apache.felix.ipojo.ComponentFactory;
+
+/**
+ * Class that represents a component for ApacheDS use.
+ *
+ * @author <a href="mailto:dev@directory.apache.org">Apache Directory Project</a>
+ */
+public class ADSComponent
+{
+ private ComponentFactory factory;
+
+ private String componentType = "user";
+
+ private String componentSchemaDn;
+
+ private List<ADSComponentInstance> instances;
+
+ private LdifReader cacheHandle;
+
+ public ComponentFactory getFactory()
+ {
+ return factory;
+ }
+
+}
Added: directory/apacheds/trunk/component-hub/src/main/java/org/apache/directory/server/component/ADSComponentInstance.java
URL: http://svn.apache.org/viewvc/directory/apacheds/trunk/component-hub/src/main/java/org/apache/directory/server/component/ADSComponentInstance.java?rev=1203217&view=auto
==============================================================================
--- directory/apacheds/trunk/component-hub/src/main/java/org/apache/directory/server/component/ADSComponentInstance.java (added)
+++ directory/apacheds/trunk/component-hub/src/main/java/org/apache/directory/server/component/ADSComponentInstance.java Thu Nov 17 15:21:39 2011
@@ -0,0 +1,39 @@
+/*
+ * 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.server.component;
+
+import org.apache.directory.shared.ldap.model.ldif.LdifEntry;
+
+/**
+ * Class that represents an individual instance of an ADSComponent
+ *
+ * @author <a href="mailto:dev@directory.apache.org">Apache Directory Project</a>
+ */
+public class ADSComponentInstance
+{
+ private LdifEntry instanceEntry;
+
+ private String configHookDn;
+
+ private Object instance;
+
+ private ADSComponent parentComponent;
+
+}
Added: directory/apacheds/trunk/component-hub/src/main/java/org/apache/directory/server/component/ADSConstants.java
URL: http://svn.apache.org/viewvc/directory/apacheds/trunk/component-hub/src/main/java/org/apache/directory/server/component/ADSConstants.java?rev=1203217&view=auto
==============================================================================
--- directory/apacheds/trunk/component-hub/src/main/java/org/apache/directory/server/component/ADSConstants.java (added)
+++ directory/apacheds/trunk/component-hub/src/main/java/org/apache/directory/server/component/ADSConstants.java Thu Nov 17 15:21:39 2011
@@ -0,0 +1,136 @@
+/*
+ * 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.server.component;
+
+
+import java.util.Dictionary;
+import java.util.Hashtable;
+
+
+/**
+ * Class to hold constants for ApacheDS component management.
+ *
+ * @author <a href="mailto:dev@directory.apache.org">Apache Directory Project</a>
+ */
+public class ADSConstants
+{
+
+ /*
+ * base directory path for component cache
+ */
+ public static final String ADS_CACHE_BASE_DIR = "adscache";
+
+ /*
+ * default file name for caching schemas inside for components
+ */
+ public static final String ADS_CACHE_SCHEMA_FILE = "schema.ldif";
+
+ /*
+ * default file name for caching instance entries inside for components
+ */
+ public static final String ADS_CACHE_INSTANCES_FILE = "instances.ldif";
+
+ /*
+ * default file name for caching version information for components
+ */
+ public static final String ADS_CACHE_VERSION_FILE = "version";
+
+ /*
+ * IPojo Handler name for ADSComponent annotation.
+ */
+ public static final String ADS_COMPONENT_HANDLER_NS = "org.apache.directory.server.component.handler";
+
+ /*
+ * IPojo Handler name for ADSComponent annotation.
+ */
+ public static final String ADS_COMPONENT_HANDLER_NAME = "ADSComponentHandler";
+
+ /*
+ * IPojo Handler name for ADSComponent annotation.
+ */
+ public static final String ADS_COMPONENT_HANDLER_FULLNAME = "org.apache.directory.server.component.handler:ADSComponentHandler";
+
+ /*
+ * iPOJO Component Type and Instance declaration header.
+ */
+ public static final String IPOJO_HEADER = "iPOJO-Components";
+
+ /*
+ * Base OID value for ApacheDS component schemas.
+ */
+ public static final String ADS_COMPONENT_BASE_OID = "1.3.6.1.4.1.18060.0.4.4";
+
+ /*
+ * Component type name of user defined components.
+ */
+ public static final String ADS_COMPONENT_TYPE_USER = "user";
+
+ /*
+ * Base DN for @ADSComponent(componentType="user") component schema elements.
+ */
+ public static final String ADS_USER_COMPONENTS_SCHEMA_DN = "cn=usercomponents,ou=schema";
+
+ /*
+ * Hash table for mapping property type name to its syntax in ApacheDS
+ */
+ public static Dictionary<String, String> syntaxMappings;
+
+ /*
+ * Hash table for mapping property type name to its equality matching rule in ApacheDS
+ */
+ public static Dictionary<String, String> equalityMappings;
+
+ /*
+ * Hash table for mapping property type name to its ordering rule in ApacheDS
+ */
+ public static Dictionary<String, String> orderingMappings;
+
+ /*
+ * Hash table for mapping property type name to its substring matching in ApacheDS
+ */
+ public static Dictionary<String, String> substringMappings;
+
+ /**
+ * Static constructor that initializes the values of the type mapping Hash tables.
+ */
+ static
+ {
+ syntaxMappings = new Hashtable<String, String>();
+ syntaxMappings.put( "int", "1.3.6.1.4.1.1466.115.121.1.27" );
+ syntaxMappings.put( "java.lang.String", "1.3.6.1.4.1.1466.115.121.1.15" );
+ syntaxMappings.put( "boolean", "1.3.6.1.4.1.1466.115.121.1.7" );
+
+ equalityMappings = new Hashtable<String, String>();
+ equalityMappings.put( "int", "integerMatch" );
+ equalityMappings.put( "java.lang.String", "caseExactMatch" );
+ equalityMappings.put( "boolean", "booleanMatch" );
+
+ orderingMappings = new Hashtable<String, String>();
+ orderingMappings.put( "int", "integerOrderingMatch" );
+ orderingMappings.put( "java.lang.String", "caseExactOrderingMatch" );
+ orderingMappings.put( "boolean", "caseIgnoreOrderingMatch" );
+
+ substringMappings = new Hashtable<String, String>();
+ substringMappings.put( "int", "numericStringSubstringsMatch" );
+ substringMappings.put( "java.lang.String", "caseExactSubstringsMatch" );
+ substringMappings.put( "boolean", "caseIgnoreSubstringsMatch" );
+ }
+
+}
Added: directory/apacheds/trunk/component-hub/src/main/java/org/apache/directory/server/component/handler/ADSComponent.java
URL: http://svn.apache.org/viewvc/directory/apacheds/trunk/component-hub/src/main/java/org/apache/directory/server/component/handler/ADSComponent.java?rev=1203217&view=auto
==============================================================================
--- directory/apacheds/trunk/component-hub/src/main/java/org/apache/directory/server/component/handler/ADSComponent.java (added)
+++ directory/apacheds/trunk/component-hub/src/main/java/org/apache/directory/server/component/handler/ADSComponent.java Thu Nov 17 15:21:39 2011
@@ -0,0 +1,31 @@
+/*
+ * 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.server.component.handler;
+
+
+/**
+ * Used to annotate ApacheDS components with their component type.
+ *
+ * @author <a href="mailto:dev@directory.apache.org">Apache Directory Project</a>
+ */
+public @interface ADSComponent
+{
+ String componentType() default "user";
+}
Added: directory/apacheds/trunk/component-hub/src/main/java/org/apache/directory/server/component/handler/ADSComponentHandler.java
URL: http://svn.apache.org/viewvc/directory/apacheds/trunk/component-hub/src/main/java/org/apache/directory/server/component/handler/ADSComponentHandler.java?rev=1203217&view=auto
==============================================================================
--- directory/apacheds/trunk/component-hub/src/main/java/org/apache/directory/server/component/handler/ADSComponentHandler.java (added)
+++ directory/apacheds/trunk/component-hub/src/main/java/org/apache/directory/server/component/handler/ADSComponentHandler.java Thu Nov 17 15:21:39 2011
@@ -0,0 +1,65 @@
+/*
+ * 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.server.component.handler;
+
+
+import java.util.Dictionary;
+
+import org.apache.felix.ipojo.ConfigurationException;
+import org.apache.felix.ipojo.PrimitiveHandler;
+import org.apache.felix.ipojo.annotations.Handler;
+import org.apache.felix.ipojo.metadata.Element;
+
+
+/**
+ * IPojo handler for ADSComponent annotation.
+ * It does not supposed to do anything. It is just to validate the custom-annotated component.
+ *
+ *
+ * @author <a href="mailto:dev@directory.apache.org">Apache Directory Project</a>
+ */
+@Handler(namespace = "org.apache.directory.server.component.handler", name = "ADSComponent")
+public class ADSComponentHandler extends PrimitiveHandler
+{
+
+ @Override
+ public void configure( Element metadata, Dictionary configuration ) throws ConfigurationException
+ {
+ // TODO Auto-generated method stub
+
+ }
+
+
+ @Override
+ public void stop()
+ {
+ // TODO Auto-generated method stub
+
+ }
+
+
+ @Override
+ public void start()
+ {
+ // TODO Auto-generated method stub
+
+ }
+
+}
Added: directory/apacheds/trunk/component-hub/src/main/java/org/apache/directory/server/component/hub/ComponentHub.java
URL: http://svn.apache.org/viewvc/directory/apacheds/trunk/component-hub/src/main/java/org/apache/directory/server/component/hub/ComponentHub.java?rev=1203217&view=auto
==============================================================================
--- directory/apacheds/trunk/component-hub/src/main/java/org/apache/directory/server/component/hub/ComponentHub.java (added)
+++ directory/apacheds/trunk/component-hub/src/main/java/org/apache/directory/server/component/hub/ComponentHub.java Thu Nov 17 15:21:39 2011
@@ -0,0 +1,418 @@
+/*
+ * 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.server.component.hub;
+
+
+import java.util.ArrayList;
+import java.util.Dictionary;
+import java.util.Enumeration;
+import java.util.Hashtable;
+import java.util.List;
+
+import org.apache.directory.server.component.ADSComponent;
+import org.apache.directory.server.component.ADSConstants;
+import org.apache.directory.server.component.hub.listener.HubListener;
+import org.apache.directory.server.component.schema.ComponentSchemaGenerator;
+import org.apache.directory.server.component.schema.UserComponentSchemaGenerator;
+import org.apache.felix.ipojo.Factory;
+import org.apache.felix.ipojo.annotations.Component;
+import org.apache.felix.ipojo.annotations.Invalidate;
+import org.apache.felix.ipojo.annotations.Requires;
+import org.apache.felix.ipojo.annotations.Validate;
+import org.apache.felix.ipojo.metadata.Element;
+import org.apache.felix.ipojo.parser.ManifestMetadataParser;
+import org.apache.felix.ipojo.parser.ParseException;
+import org.apache.felix.ipojo.whiteboard.Wbp;
+import org.apache.felix.ipojo.whiteboard.Whiteboards;
+import org.osgi.framework.ServiceReference;
+import org.osgi.service.log.LogService;
+
+
+/**
+ * An IPojo component that listens for incoming factories and instances.
+ * Creating or destroying corresponding ADSComponent from them.
+ *
+ *
+ * @author <a href="mailto:dev@directory.apache.org">Apache Directory Project</a>
+ */
+@Component
+@Whiteboards(whiteboards =
+ {
+ @Wbp(onArrival = "onFactoryArrival",
+ onDeparture = "onFactoryDeparture",
+ filter = "(objectClass=org.apache.felix.ipojo.Factory)"),
+ @Wbp(onArrival = "onInstanceArrival",
+ onDeparture = "onInstanceDeparture",
+ filter = "(objectClass=org.apache.felix.ipojo.architecture.Architecture)")
+})
+public class ComponentHub
+{
+ /*
+ * boolean value to check for deferred writes to schema partition
+ */
+ private boolean schemaReady = false;
+
+ /*
+ * boolean value to check for deferred writes to config partition
+ */
+ private boolean configReady = false;
+
+ /*
+ * Map to keep "component type" -> "components" mapping.
+ */
+ private Dictionary<String, List<ADSComponent>> componentMap;
+
+ /*
+ * List to keep all active ApacheDS components.
+ */
+ private List<ADSComponent> components;
+
+ /*
+ * Map to keep "component type" -> "schema generator" mapping.
+ */
+ private Dictionary<String, ComponentSchemaGenerator> schemaGenerators;
+
+ /*
+ * Map to keep "component type" -> "listeners" mapping
+ */
+ private Dictionary<String, List<HubListener>> listenersMap;
+
+ /*
+ * OSGI Logger
+ */
+ @Requires
+ private LogService logger;
+
+
+ public ComponentHub()
+ {
+ componentMap = new Hashtable<String, List<ADSComponent>>();
+ components = new ArrayList<ADSComponent>();
+
+ schemaGenerators = new Hashtable<String, ComponentSchemaGenerator>();
+ schemaGenerators.put( ADSConstants.ADS_COMPONENT_TYPE_USER, new UserComponentSchemaGenerator() );
+
+ listenersMap = new Hashtable<String, List<HubListener>>();
+ }
+
+
+ /**
+ * Called when ADSComponentHub instance is validated by IPojo
+ *
+ */
+ @Validate
+ public void hubValidated()
+ {
+ logger.log( LogService.LOG_INFO, "ADSComponentHub validated." );
+ }
+
+
+ /**
+ * Called when ADSComponentHub instance is invalidated by IPojo
+ *
+ */
+ @Invalidate
+ public void hubInvalidated()
+ {
+ logger.log( LogService.LOG_INFO, "ADSComponentHub validated." );
+ }
+
+
+ /**
+ * Factory arrival callback, registered by whiteboard handler.
+ *
+ * @param ref Reference to IPojo Factory
+ */
+ public void onFactoryArrival( ServiceReference ref )
+ {
+ Factory arrivingFactory = ( Factory ) ref.getBundle().getBundleContext().getService( ref );
+ if ( !checkIfADSComponent( arrivingFactory ) )
+ {
+ return;
+ }
+
+ try
+ {
+ String componentType = parseComponentType( arrivingFactory );
+
+ List<HubListener> listenersByType = listenersMap.get( componentType );
+
+ // Fire the 'factory arrived' event on listeners.
+ if ( listenersByType != null )
+ {
+ for ( HubListener listener : listenersByType )
+ {
+ listener.onFactoryArrival( arrivingFactory );
+ }
+ }
+
+ //Actual ADSComponent creation
+ ADSComponent component = generateADSComponent( componentType, arrivingFactory );
+
+ // Iterate over listeners for 'component created' event. Apply the changes applied by them.
+ if ( listenersByType != null )
+ {
+ for ( HubListener listener : listenersByType )
+ {
+ ADSComponent _comp = listener.onComponentCreation( component );
+ if ( _comp != null )
+ {
+ component = _comp;
+ }
+ }
+ }
+
+ //Keep the newly created ADSComponent reference.
+ components.add( component );
+
+ List<ADSComponent> componentsByType = componentMap.get( componentType );
+ if ( componentsByType == null )
+ {
+ List<ADSComponent> newCompList = new ArrayList<ADSComponent>();
+ newCompList.add( component );
+ componentMap.put( componentType, newCompList );
+ }
+ else
+ {
+ componentsByType.add( component );
+ }
+
+ }
+ catch ( ParseException e )
+ {
+ e.printStackTrace();
+ }
+
+ }
+
+
+ /**
+ * Factory departure callback, registered by whiteboard handler.
+ *
+ * @param ref Reference to IPojo Factory
+ */
+ public void onFactoryDeparture( ServiceReference ref )
+ {
+ Factory leavingFactory = ( Factory ) ref.getBundle().getBundleContext().getService( ref );
+ if ( !checkIfADSComponent( leavingFactory ) )
+ {
+ return;
+ }
+
+ try
+ {
+ String componentType = parseComponentType( leavingFactory );
+
+ List<HubListener> listenersByType = listenersMap.get( componentType );
+
+ // Fire the 'factory leaving' event on listeners.
+ if ( listenersByType != null )
+ {
+ for ( HubListener listener : listenersByType )
+ {
+ listener.onFactoryDeparture( leavingFactory );
+ }
+ }
+
+ ADSComponent associatedComp = null;
+ for ( ADSComponent _comp : components )
+ {
+ if ( _comp.getFactory().getName().equals( leavingFactory.getName() ) )
+ {
+ associatedComp = _comp;
+ break;
+ }
+ }
+
+ if ( associatedComp == null )
+ {
+ logger.log( LogService.LOG_INFO, "Couldn't found an associated ADSComponent for factory:"
+ + leavingFactory.getName() );
+ return;
+ }
+
+ // Iterate over listeners for 'component deleting' event.
+ if ( listenersByType != null )
+ {
+ for ( HubListener listener : listenersByType )
+ {
+ listener.onComponentDeletion( associatedComp );
+ }
+ }
+
+ // All clients are notified now cache and delete the ADSComponent existence on ApacheDS
+ cacheAndReleaseADSComponent( associatedComp );
+
+ }
+ catch ( ParseException e )
+ {
+ e.printStackTrace();
+ }
+ }
+
+
+ /**
+ * IPojo instance arrival callback, registered by whiteboard handler.
+ *
+ * @param ref Reference to IPojo instance
+ */
+ public void onInstanceArrival( ServiceReference ref )
+ {
+
+ }
+
+
+ /**
+ * IPojo instance departure callback, registered by whiteboard handler.
+ *
+ * @param ref Reference to IPojo instance
+ */
+ public void onInstanceDeparture( ServiceReference ref )
+ {
+
+ }
+
+
+ /**
+ * Check whether the argument is ADSComponent annotated.
+ *
+ * @param factory
+ * @return
+ */
+ private boolean checkIfADSComponent( Factory factory )
+ {
+ List<String> handlers = factory.getRequiredHandlers();
+ for ( String handlerName : handlers )
+ {
+ if ( handlerName.equals( ADSConstants.ADS_COMPONENT_HANDLER_FULLNAME ) )
+ {
+ return true;
+ }
+ }
+
+ return false;
+ }
+
+
+ private String parseComponentType( Factory factory ) throws ParseException
+ {
+ Dictionary bundleHeaders = factory.getBundleContext().getBundle().getHeaders();
+ String ipojoHeader = ( String ) bundleHeaders.get( ADSConstants.IPOJO_HEADER );
+
+ if ( ipojoHeader == null )
+ {
+ throw new ParseException( "Null ipojo header returned for factory: " + factory.getName() );
+ }
+
+ ManifestMetadataParser parser = new ManifestMetadataParser();
+ parser.parseHeader( ipojoHeader );
+
+ Element[] componentMetas = parser.getComponentsMetadata();
+
+ for ( Element componentMeta : componentMetas )
+ {
+ String compName = componentMeta.getAttribute( "name" );
+ if ( compName.equals( factory.getName() ) )
+ {
+ Element[] adsElements = componentMeta.getElements(
+ ADSConstants.ADS_COMPONENT_HANDLER_NAME,
+ ADSConstants.ADS_COMPONENT_HANDLER_NS );
+
+ if ( adsElements == null || adsElements.length == 0 )
+ {
+ throw new ParseException( "ADSComponent element couldn't be found for factory: "
+ + factory.getName() );
+ }
+
+ return adsElements[0].getAttribute( "componentType" );
+ }
+ }
+
+ return null;
+ }
+
+
+ /**
+ * Generates a new ADSComponent with its schema and cache handle.
+ *
+ * @param componentType Type of a component being created
+ * @param factory a factory reference to create a ADSComponent for.
+ * @return
+ */
+ private ADSComponent generateADSComponent( String componentType, Factory factory )
+ {
+ return null;
+ }
+
+
+ /**
+ * Cache the ADSComponent existence on ApacheDS with all of its DIT entries. And then release it from hub.
+ *
+ * @param leavingComp ADSComponent reference to cache and release.
+ */
+ private void cacheAndReleaseADSComponent( ADSComponent leavingComp )
+ {
+
+ }
+
+
+ /**
+ * Registers a HubListener for specified component type.
+ *
+ * @param componentType component type to get notifications for.
+ * @param listener HubListener implementation
+ */
+ public void registerListener( String componentType, HubListener listener )
+ {
+ List<HubListener> listenersForComp = listenersMap.get( componentType );
+ if ( listenersForComp == null )
+ {
+ ArrayList<HubListener> list = new ArrayList<HubListener>();
+ list.add( listener );
+ listenersMap.put( componentType, list );
+ }
+ else
+ {
+ if ( !listenersForComp.contains( listener ) )
+ {
+ listenersForComp.add( listener );
+ }
+ }
+ }
+
+
+ /**
+ * Removes the specified listener from the notification chain.
+ *
+ * @param listener HubListener implementation
+ */
+ public void removeListener( HubListener listener )
+ {
+ Enumeration<List<HubListener>> it = listenersMap.elements();
+ while ( it.hasMoreElements() )
+ {
+ List<HubListener> list = it.nextElement();
+ if ( list.contains( listener ) )
+ {
+ list.remove( listener );
+ }
+ }
+ }
+}
Added: directory/apacheds/trunk/component-hub/src/main/java/org/apache/directory/server/component/hub/listener/AbstractHubListener.java
URL: http://svn.apache.org/viewvc/directory/apacheds/trunk/component-hub/src/main/java/org/apache/directory/server/component/hub/listener/AbstractHubListener.java?rev=1203217&view=auto
==============================================================================
--- directory/apacheds/trunk/component-hub/src/main/java/org/apache/directory/server/component/hub/listener/AbstractHubListener.java (added)
+++ directory/apacheds/trunk/component-hub/src/main/java/org/apache/directory/server/component/hub/listener/AbstractHubListener.java Thu Nov 17 15:21:39 2011
@@ -0,0 +1,76 @@
+/*
+ * 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.server.component.hub.listener;
+
+
+import org.apache.directory.server.component.ADSComponent;
+import org.apache.felix.ipojo.Factory;
+
+
+/**
+ * Abstract HubListener implementation. Override the intended methods to receive notifications.
+ *
+ * @author <a href="mailto:dev@directory.apache.org">Apache Directory Project</a>
+ */
+public abstract class AbstractHubListener implements HubListener
+{
+
+ /*
+ * (non-Javadoc)
+ * @see org.apache.directory.server.component.hub.listener.HubListener#onFactoryArrival(org.apache.felix.ipojo.Factory)
+ */
+ @Override
+ public void onFactoryArrival( Factory factory )
+ {
+ }
+
+
+ /*
+ * (non-Javadoc)
+ * @see org.apache.directory.server.component.hub.listener.HubListener#onFactoryDeparture(org.apache.felix.ipojo.Factory)
+ */
+ @Override
+ public void onFactoryDeparture( Factory factory )
+ {
+
+ }
+
+
+ /*
+ * (non-Javadoc)
+ * @see org.apache.directory.server.component.hub.listener.HubListener#onComponentCreation(org.apache.directory.server.component.ADSComponent)
+ */
+ @Override
+ public ADSComponent onComponentCreation( ADSComponent component )
+ {
+ return null;
+ }
+
+
+ /*
+ * (non-Javadoc)
+ * @see org.apache.directory.server.component.hub.listener.HubListener#onComponentDeletion(org.apache.directory.server.component.ADSComponent)
+ */
+ @Override
+ public void onComponentDeletion( ADSComponent component )
+ {
+ }
+
+}
Added: directory/apacheds/trunk/component-hub/src/main/java/org/apache/directory/server/component/hub/listener/HubListener.java
URL: http://svn.apache.org/viewvc/directory/apacheds/trunk/component-hub/src/main/java/org/apache/directory/server/component/hub/listener/HubListener.java?rev=1203217&view=auto
==============================================================================
--- directory/apacheds/trunk/component-hub/src/main/java/org/apache/directory/server/component/hub/listener/HubListener.java (added)
+++ directory/apacheds/trunk/component-hub/src/main/java/org/apache/directory/server/component/hub/listener/HubListener.java Thu Nov 17 15:21:39 2011
@@ -0,0 +1,73 @@
+/*
+ * 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.server.component.hub.listener;
+
+
+import org.apache.directory.server.component.ADSComponent;
+import org.apache.felix.ipojo.Factory;
+import org.apache.felix.ipojo.architecture.Architecture;
+
+
+/**
+ * Interface for the classes those want to be notified of ComponentHub.
+ * Listeners can bind themselves using ComponentHub.registerListener() method,
+ * and can remove themselves using ComponentHub.removeListener() method.
+ * TODO HubListener.
+ *
+ * @author <a href="mailto:dev@directory.apache.org">Apache Directory Project</a>
+ */
+public interface HubListener
+{
+ /**
+ * Notified when a new factory is sniffed by Hub.
+ *
+ * @param factory arriving factory
+ */
+ public void onFactoryArrival( Factory factory );
+
+
+ /**
+ * Notified when a factory leaving the container.
+ *
+ * @param factory departuring factory
+ */
+ public void onFactoryDeparture( Factory factory );
+
+
+ /**
+ * Notified when a new ADSComponent is created.
+ * Listener can change the newly created ADSComponent by returning changed ADSComponent.(Be cautious)
+ *
+ * @param component newly created ADSComponent
+ * @return the overrided version of the ADSComponent or null if no change is intended.
+ */
+ public ADSComponent onComponentCreation( ADSComponent component );
+
+
+ /**
+ * Notified when a new ADSComponent is about to be disposed.
+ * Called before component disposal begins.
+ *
+ * @param component disposing created ADSComponent
+ * @return the overrided version of the ADSComponent or null if no change is intended.
+ */
+ public void onComponentDeletion( ADSComponent component );
+
+}
Added: directory/apacheds/trunk/component-hub/src/main/java/org/apache/directory/server/component/schema/ADSComponentSchema.java
URL: http://svn.apache.org/viewvc/directory/apacheds/trunk/component-hub/src/main/java/org/apache/directory/server/component/schema/ADSComponentSchema.java?rev=1203217&view=auto
==============================================================================
--- directory/apacheds/trunk/component-hub/src/main/java/org/apache/directory/server/component/schema/ADSComponentSchema.java (added)
+++ directory/apacheds/trunk/component-hub/src/main/java/org/apache/directory/server/component/schema/ADSComponentSchema.java Thu Nov 17 15:21:39 2011
@@ -0,0 +1,103 @@
+/*
+ * 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.server.component.schema;
+
+
+import java.util.ArrayList;
+import java.util.List;
+
+import org.apache.directory.shared.ldap.model.ldif.LdifEntry;
+
+
+/**
+ * Class that represents an ADSComponent's schema definition.
+ *
+ * @author <a href="mailto:dev@directory.apache.org">Apache Directory Project</a>
+ */
+public class ADSComponentSchema
+{
+ /*
+ * Schema elements (attribs,ocs) for component.
+ */
+ private List<LdifEntry> schemaElements = null;
+
+ /*
+ * True if the @schemaElements contains complete schema definition with schema entry.
+ */
+ private boolean completeSchema = false;
+
+ /*
+ * Schema name which @schemaElements will go under.
+ */
+ private String parentSchemaDn = null;
+
+
+ public ADSComponentSchema( String name, List<LdifEntry> elements )
+ {
+ this( name, elements, false );
+ }
+
+
+ public ADSComponentSchema( String parentSchema, List<LdifEntry> elements, boolean complete )
+ {
+ parentSchemaDn = parentSchema;
+ schemaElements = elements;
+ completeSchema = complete;
+ }
+
+
+ /**
+ * Getter for completeSchema
+ *
+ * @return true if schema is complete with schema entry.
+ */
+ public boolean ifCompleteSchema()
+ {
+ return completeSchema;
+ }
+
+
+ /**
+ * Returns name of the schema
+ *
+ * @return name of the schema
+ */
+ public String getParentSchemaName()
+ {
+ return parentSchemaDn;
+ }
+
+
+ /**
+ * Gets the clone of the schema elements.
+ *
+ * @return clone of the schema elements.
+ */
+ public List<LdifEntry> getSchemaElements()
+ {
+ if ( schemaElements == null )
+ {
+ return null;
+ }
+
+ return new ArrayList<LdifEntry>( schemaElements );
+ }
+
+}
Added: directory/apacheds/trunk/component-hub/src/main/java/org/apache/directory/server/component/schema/ComponentOIDGenerator.java
URL: http://svn.apache.org/viewvc/directory/apacheds/trunk/component-hub/src/main/java/org/apache/directory/server/component/schema/ComponentOIDGenerator.java?rev=1203217&view=auto
==============================================================================
--- directory/apacheds/trunk/component-hub/src/main/java/org/apache/directory/server/component/schema/ComponentOIDGenerator.java (added)
+++ directory/apacheds/trunk/component-hub/src/main/java/org/apache/directory/server/component/schema/ComponentOIDGenerator.java Thu Nov 17 15:21:39 2011
@@ -0,0 +1,88 @@
+/*
+ * 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.server.component.schema;
+
+
+import org.apache.directory.server.component.ADSConstants;
+
+
+/**
+ * This is a simple incremental generator for OID assignments of custom generated schemas.
+ * Ensuring consistency among different servers on the cluster will be replication layer's duty.
+ * TODO ADSComponentOIDGenerator.
+ *
+ * @author <a href="mailto:dev@directory.apache.org">Apache Directory Project</a>
+ */
+public class ComponentOIDGenerator
+{
+ /*
+ * Base OID to generate sequential OIDs against.
+ */
+ private static String baseOID = null;
+
+ /*
+ * Counters to keep track.
+ */
+ private static int componentCounter;
+ private static int ocCounter;
+ private static int attribCounter;
+
+ static
+ {
+ baseOID = ADSConstants.ADS_COMPONENT_BASE_OID;
+
+ componentCounter = 0;
+ ocCounter = 0;
+ attribCounter = 0;
+ }
+
+
+ /**
+ * Returns OID for component
+ *
+ * @return oid for component
+ */
+ public static synchronized String generateComponentOID()
+ {
+ return baseOID + "." + ( ++componentCounter );
+ }
+
+
+ /**
+ * Returns OID for object class under specified component base OID.
+ *
+ * @return oid for object class
+ */
+ public static synchronized String generateOCOID( String componentBase )
+ {
+ return componentBase + ".1." + ( ++ocCounter );
+ }
+
+
+ /**
+ * Returns OID for attribute under specified component base OID.
+ *
+ * @return oid for attribute
+ */
+ public static synchronized String generateAttribOID( String componentBase )
+ {
+ return componentBase + ".2." + ( ++attribCounter );
+ }
+}
Added: directory/apacheds/trunk/component-hub/src/main/java/org/apache/directory/server/component/schema/ComponentSchemaGenerator.java
URL: http://svn.apache.org/viewvc/directory/apacheds/trunk/component-hub/src/main/java/org/apache/directory/server/component/schema/ComponentSchemaGenerator.java?rev=1203217&view=auto
==============================================================================
--- directory/apacheds/trunk/component-hub/src/main/java/org/apache/directory/server/component/schema/ComponentSchemaGenerator.java (added)
+++ directory/apacheds/trunk/component-hub/src/main/java/org/apache/directory/server/component/schema/ComponentSchemaGenerator.java Thu Nov 17 15:21:39 2011
@@ -0,0 +1,44 @@
+/*
+ * 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.server.component.schema;
+
+
+import org.apache.felix.ipojo.Factory;
+
+
+/**
+ * Interface for classes generating schemas for component types.
+ *
+ * @author <a href="mailto:dev@directory.apache.org">Apache Directory Project</a>
+ */
+public interface ComponentSchemaGenerator
+{
+ /**
+ * Generates a schema for representing all of factory's configurables.
+ * Returned schema is in right order to add it to LDAP without any sorting.
+ *
+ * If factory does not need a custom schema, it does not generate a schema for
+ * it, just returns the name of stock schema instead.
+ *
+ * @param factory Factory reference to generate schema for.
+ * @return Schema in the form of LdifEntry list.
+ */
+ public ADSComponentSchema generateOrGetSchemaElements( Factory factory );
+}
Added: directory/apacheds/trunk/component-hub/src/main/java/org/apache/directory/server/component/schema/UserComponentSchemaGenerator.java
URL: http://svn.apache.org/viewvc/directory/apacheds/trunk/component-hub/src/main/java/org/apache/directory/server/component/schema/UserComponentSchemaGenerator.java?rev=1203217&view=auto
==============================================================================
--- directory/apacheds/trunk/component-hub/src/main/java/org/apache/directory/server/component/schema/UserComponentSchemaGenerator.java (added)
+++ directory/apacheds/trunk/component-hub/src/main/java/org/apache/directory/server/component/schema/UserComponentSchemaGenerator.java Thu Nov 17 15:21:39 2011
@@ -0,0 +1,157 @@
+/*
+ * 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.server.component.schema;
+
+
+import java.util.ArrayList;
+import java.util.List;
+
+import org.apache.directory.server.component.ADSConstants;
+import org.apache.directory.shared.ldap.model.exception.LdapInvalidAttributeValueException;
+import org.apache.directory.shared.ldap.model.exception.LdapInvalidDnException;
+import org.apache.directory.shared.ldap.model.ldif.LdapLdifException;
+import org.apache.directory.shared.ldap.model.ldif.LdifEntry;
+import org.apache.felix.ipojo.Factory;
+import org.apache.felix.ipojo.architecture.PropertyDescription;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+
+public class UserComponentSchemaGenerator implements ComponentSchemaGenerator
+{
+
+ private static final Logger LOG = LoggerFactory.getLogger( UserComponentSchemaGenerator.class );
+
+
+ @Override
+ public ADSComponentSchema generateOrGetSchemaElements( Factory componentFactory )
+ {
+ List<LdifEntry> schemaElements = new ArrayList<LdifEntry>();
+
+ String componentName = componentFactory.getName();
+ if ( componentName.contains( "." ) )
+ {
+ componentName = componentName.substring( componentName.lastIndexOf( '.' ) + 1 );
+ }
+
+ String schemaDn = ADSConstants.ADS_USER_COMPONENTS_SCHEMA_DN;
+
+ String attribsDn = "ou=attributeTypes," + schemaDn;
+ String ocsDn = "ou=objectClasses," + schemaDn;
+
+ //Will hold the m-must attributes while iterating over properties of the component
+ List<String> ocAttribs = new ArrayList<String>();
+
+ // Creating schema elements with proper order and pushing them into the list
+ try
+ {
+
+ String componentBaseOID = ComponentOIDGenerator.generateComponentOID();
+
+ for ( PropertyDescription prop : componentFactory.getComponentDescription().getProperties() )
+ {
+
+ //Must be lower case, alphanumeric only
+ String propname = prop.getName();
+
+ String proptype = prop.getType();
+ String propoid = ComponentOIDGenerator.generateAttribOID( componentBaseOID );
+ String propdn = "m-oid=" + propoid + "," + attribsDn;
+
+ if ( !( proptype.equals( "int" ) || proptype.equals( "java.lang.String" ) || proptype
+ .equals( "boolean" ) ) )
+ {
+ LOG.info( "Property found with an incompatible type: "
+ + propname + ":" + proptype );
+ continue;
+ }
+
+ String syntax = ADSConstants.syntaxMappings.get( proptype );
+ String equality = ADSConstants.equalityMappings.get( proptype );
+ String ordering = ADSConstants.orderingMappings.get( proptype );
+ String substr = ADSConstants.substringMappings.get( proptype );
+
+ schemaElements.add( new LdifEntry( propdn,
+ "objectclass:metaAttributeType",
+ "objectclass:metaTop",
+ "objectclass:top",
+ "m-oid:" + propoid,
+ "m-name:" + propname,
+ "m-description:Property of component type " + componentName,
+ "m-equality:" + equality,
+ "m-ordering:" + ordering,
+ "m-substr:" + substr,
+ "m-syntax:" + syntax,
+ "m-length:0",
+ "m-singleValue:TRUE" ) );
+
+ if ( prop.isMandatory() )
+ {
+ ocAttribs.add( "m-must:" + propname );
+ }
+ else
+ {
+ ocAttribs.add( "m-may:" + propname );
+ }
+
+ }
+
+ schemaElements.add( new LdifEntry( ocsDn,
+ "objectclass:organizationalUnit",
+ "objectClass:top",
+ "ou:objectClasses" ) );
+
+ String ocoid = ComponentOIDGenerator.generateOCOID( componentBaseOID );
+ String ocDn = "m-oid=" + ocoid + "," + ocsDn;
+
+ ocAttribs.add( 0, "m-may:cached" );
+ ocAttribs.add( 0, "m-must:ins" );
+ ocAttribs.add( 0, "m-must:active" );
+ ocAttribs.add( 0, "m-supObjectClass: top" );
+ ocAttribs.add( 0, "m-description:Object Class for generating instances of:" + componentName );
+ ocAttribs.add( 0, "m-name:" + componentName );
+ ocAttribs.add( 0, "m-oid:" + ocoid );
+ ocAttribs.add( 0, "objectclass: top" );
+ ocAttribs.add( 0, "objectclass: metaTop" );
+ ocAttribs.add( 0, "objectclass: metaObjectClass" );
+
+ schemaElements.add( new LdifEntry( ocDn, ocAttribs.toArray() ) );
+
+ }
+ catch ( LdapInvalidAttributeValueException e )
+ {
+ LOG.info( "ADSSchemaManager#generateSchema: Error(LdapInvalidAttributeValueException) while creating LdifEntry for: "
+ + componentFactory );
+ }
+ catch ( LdapInvalidDnException e )
+ {
+ LOG.info( "ADSSchemaManager#generateSchema: Error(LdapInvalidDnException) while creating LdifEntry for: "
+ + componentFactory );
+ }
+ catch ( LdapLdifException e )
+ {
+ LOG.info( "ADSSchemaManager#generateSchema: Error(LdapLdifException) while creating LdifEntry for: "
+ + componentFactory );
+ }
+
+ return new ADSComponentSchema( ADSConstants.ADS_USER_COMPONENTS_SCHEMA_DN, schemaElements );
+ }
+
+}
Modified: directory/apacheds/trunk/pom.xml
URL: http://svn.apache.org/viewvc/directory/apacheds/trunk/pom.xml?rev=1203217&r1=1203216&r2=1203217&view=diff
==============================================================================
--- directory/apacheds/trunk/pom.xml (original)
+++ directory/apacheds/trunk/pom.xml Thu Nov 17 15:21:39 2011
@@ -151,6 +151,7 @@
<module>apache-felix</module>
<module>dependencies</module>
<module>service-osgi</module>
+ <module>component-hub</module>
</modules>
<build>
Re: svn commit: r1203217 - in /directory/apacheds/trunk: ./ component-hub/ component-hub/src/ component-hub/src/main/ component-hub/src/main/java/ component-hub/src/main/java/org/ component-hub/src/main/java/org/apache/ component-hub/src/main/java/org/apac...
Posted by Pierre-Arnaud Marcelot <pa...@marcelot.net>.
Hi Göktürk,
As I was merging modifications from trunk to the OSGI branch, I noticed this commit was done on trunk instead of the OSGI branch.
Was this on purpose?
Regards,
Pierre-Arnaud
On 17 nov. 2011, at 16:21, gokturk@apache.org wrote:
> Author: gokturk
> Date: Thu Nov 17 15:21:39 2011
> New Revision: 1203217
>
> URL: http://svn.apache.org/viewvc?rev=1203217&view=rev
> Log:
> First work on ApacheDS ComponentHub ( the IPojo based main plug-in layer).
>
> TODO:
> * Implement ComponentManager for ComponentHub's clients to manage component instances,schema and configuration
> * Implement entry cache to preserve component instance configuration across server sessions.
> * Add test cases for "customuser" typed components.
> ......
> * Create InterceptorHubClient to manage interceptors using plug-in layer.
>
>
> Added:
> directory/apacheds/trunk/component-hub/
> directory/apacheds/trunk/component-hub/pom.xml
> directory/apacheds/trunk/component-hub/src/
> directory/apacheds/trunk/component-hub/src/main/
> directory/apacheds/trunk/component-hub/src/main/java/
> directory/apacheds/trunk/component-hub/src/main/java/org/
> directory/apacheds/trunk/component-hub/src/main/java/org/apache/
> directory/apacheds/trunk/component-hub/src/main/java/org/apache/directory/
> directory/apacheds/trunk/component-hub/src/main/java/org/apache/directory/server/
> directory/apacheds/trunk/component-hub/src/main/java/org/apache/directory/server/component/
> directory/apacheds/trunk/component-hub/src/main/java/org/apache/directory/server/component/ADSComponent.java
> directory/apacheds/trunk/component-hub/src/main/java/org/apache/directory/server/component/ADSComponentInstance.java
> directory/apacheds/trunk/component-hub/src/main/java/org/apache/directory/server/component/ADSConstants.java
> directory/apacheds/trunk/component-hub/src/main/java/org/apache/directory/server/component/handler/
> directory/apacheds/trunk/component-hub/src/main/java/org/apache/directory/server/component/handler/ADSComponent.java
> directory/apacheds/trunk/component-hub/src/main/java/org/apache/directory/server/component/handler/ADSComponentHandler.java
> directory/apacheds/trunk/component-hub/src/main/java/org/apache/directory/server/component/hub/
> directory/apacheds/trunk/component-hub/src/main/java/org/apache/directory/server/component/hub/ComponentHub.java
> directory/apacheds/trunk/component-hub/src/main/java/org/apache/directory/server/component/hub/listener/
> directory/apacheds/trunk/component-hub/src/main/java/org/apache/directory/server/component/hub/listener/AbstractHubListener.java
> directory/apacheds/trunk/component-hub/src/main/java/org/apache/directory/server/component/hub/listener/HubListener.java
> directory/apacheds/trunk/component-hub/src/main/java/org/apache/directory/server/component/schema/
> directory/apacheds/trunk/component-hub/src/main/java/org/apache/directory/server/component/schema/ADSComponentSchema.java
> directory/apacheds/trunk/component-hub/src/main/java/org/apache/directory/server/component/schema/ComponentOIDGenerator.java
> directory/apacheds/trunk/component-hub/src/main/java/org/apache/directory/server/component/schema/ComponentSchemaGenerator.java
> directory/apacheds/trunk/component-hub/src/main/java/org/apache/directory/server/component/schema/UserComponentSchemaGenerator.java
> Modified:
> directory/apacheds/trunk/pom.xml
>
> Added: directory/apacheds/trunk/component-hub/pom.xml
> URL: http://svn.apache.org/viewvc/directory/apacheds/trunk/component-hub/pom.xml?rev=1203217&view=auto
> ==============================================================================
> --- directory/apacheds/trunk/component-hub/pom.xml (added)
> +++ directory/apacheds/trunk/component-hub/pom.xml Thu Nov 17 15:21:39 2011
> @@ -0,0 +1,97 @@
> +<?xml version="1.0" encoding="UTF-8"?>
> +
> +<!--
> + 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.
> +-->
> +
> +<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
> + <modelVersion>4.0.0</modelVersion>
> + <parent>
> + <groupId>org.apache.directory.server</groupId>
> + <artifactId>apacheds-parent</artifactId>
> + <version>2.0.0-M4-SNAPSHOT</version>
> + </parent>
> +
> + <artifactId>apacheds-component-hub</artifactId>
> + <name>ApacheDS Component Hub</name>
> + <packaging>bundle</packaging>
> + <description>Provides main plugin-layer for ApacheDS</description>
> +
> + <dependencies>
> +
> + <dependency>
> + <groupId>org.apache.directory.server</groupId>
> + <artifactId>apacheds-core-api</artifactId>
> + </dependency>
> +
> + <dependency>
> + <groupId>org.apache.directory.shared</groupId>
> + <artifactId>shared-ldap-model</artifactId>
> + </dependency>
> +
> + <dependency>
> + <groupId>org.apache.felix</groupId>
> + <artifactId>org.apache.felix.ipojo.annotations</artifactId>
> + <version>1.8.0</version>
> + </dependency>
> +
> + <dependency>
> + <groupId>org.apache.felix</groupId>
> + <artifactId>org.apache.felix.ipojo.handler.whiteboard</artifactId>
> + <version>1.6.0</version>
> + </dependency>
> +
> + <dependency>
> + <groupId>org.osgi</groupId>
> + <artifactId>org.osgi.core</artifactId>
> + <version>4.3.0</version>
> + </dependency>
> +
> + </dependencies>
> +
> + <build>
> + <plugins>
> + <plugin>
> + <groupId>org.apache.felix</groupId>
> + <artifactId>maven-bundle-plugin</artifactId>
> + <inherited>true</inherited>
> + <extensions>true</extensions>
> + <configuration>
> + <manifestLocation>META-INF</manifestLocation>
> + <instructions>
> + <Bundle-SymbolicName>${project.groupId}.component.hub</Bundle-SymbolicName>
> + </instructions>
> + </configuration>
> + </plugin>
> +
> + <plugin>
> + <groupId>org.apache.felix</groupId>
> + <artifactId>maven-ipojo-plugin</artifactId>
> + <version>1.8.0</version>
> + <executions>
> + <execution>
> + <goals>
> + <goal>ipojo-bundle</goal>
> + </goals>
> + </execution>
> + </executions>
> + </plugin>
> + </plugins>
> + </build>
> +</project>
> +
>
> Added: directory/apacheds/trunk/component-hub/src/main/java/org/apache/directory/server/component/ADSComponent.java
> URL: http://svn.apache.org/viewvc/directory/apacheds/trunk/component-hub/src/main/java/org/apache/directory/server/component/ADSComponent.java?rev=1203217&view=auto
> ==============================================================================
> --- directory/apacheds/trunk/component-hub/src/main/java/org/apache/directory/server/component/ADSComponent.java (added)
> +++ directory/apacheds/trunk/component-hub/src/main/java/org/apache/directory/server/component/ADSComponent.java Thu Nov 17 15:21:39 2011
> @@ -0,0 +1,49 @@
> +/*
> + * 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.server.component;
> +
> +import java.util.List;
> +
> +import org.apache.directory.shared.ldap.model.ldif.LdifReader;
> +import org.apache.felix.ipojo.ComponentFactory;
> +
> +/**
> + * Class that represents a component for ApacheDS use.
> + *
> + * @author <a href="mailto:dev@directory.apache.org">Apache Directory Project</a>
> + */
> +public class ADSComponent
> +{
> + private ComponentFactory factory;
> +
> + private String componentType = "user";
> +
> + private String componentSchemaDn;
> +
> + private List<ADSComponentInstance> instances;
> +
> + private LdifReader cacheHandle;
> +
> + public ComponentFactory getFactory()
> + {
> + return factory;
> + }
> +
> +}
>
> Added: directory/apacheds/trunk/component-hub/src/main/java/org/apache/directory/server/component/ADSComponentInstance.java
> URL: http://svn.apache.org/viewvc/directory/apacheds/trunk/component-hub/src/main/java/org/apache/directory/server/component/ADSComponentInstance.java?rev=1203217&view=auto
> ==============================================================================
> --- directory/apacheds/trunk/component-hub/src/main/java/org/apache/directory/server/component/ADSComponentInstance.java (added)
> +++ directory/apacheds/trunk/component-hub/src/main/java/org/apache/directory/server/component/ADSComponentInstance.java Thu Nov 17 15:21:39 2011
> @@ -0,0 +1,39 @@
> +/*
> + * 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.server.component;
> +
> +import org.apache.directory.shared.ldap.model.ldif.LdifEntry;
> +
> +/**
> + * Class that represents an individual instance of an ADSComponent
> + *
> + * @author <a href="mailto:dev@directory.apache.org">Apache Directory Project</a>
> + */
> +public class ADSComponentInstance
> +{
> + private LdifEntry instanceEntry;
> +
> + private String configHookDn;
> +
> + private Object instance;
> +
> + private ADSComponent parentComponent;
> +
> +}
>
> Added: directory/apacheds/trunk/component-hub/src/main/java/org/apache/directory/server/component/ADSConstants.java
> URL: http://svn.apache.org/viewvc/directory/apacheds/trunk/component-hub/src/main/java/org/apache/directory/server/component/ADSConstants.java?rev=1203217&view=auto
> ==============================================================================
> --- directory/apacheds/trunk/component-hub/src/main/java/org/apache/directory/server/component/ADSConstants.java (added)
> +++ directory/apacheds/trunk/component-hub/src/main/java/org/apache/directory/server/component/ADSConstants.java Thu Nov 17 15:21:39 2011
> @@ -0,0 +1,136 @@
> +/*
> + * 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.server.component;
> +
> +
> +import java.util.Dictionary;
> +import java.util.Hashtable;
> +
> +
> +/**
> + * Class to hold constants for ApacheDS component management.
> + *
> + * @author <a href="mailto:dev@directory.apache.org">Apache Directory Project</a>
> + */
> +public class ADSConstants
> +{
> +
> + /*
> + * base directory path for component cache
> + */
> + public static final String ADS_CACHE_BASE_DIR = "adscache";
> +
> + /*
> + * default file name for caching schemas inside for components
> + */
> + public static final String ADS_CACHE_SCHEMA_FILE = "schema.ldif";
> +
> + /*
> + * default file name for caching instance entries inside for components
> + */
> + public static final String ADS_CACHE_INSTANCES_FILE = "instances.ldif";
> +
> + /*
> + * default file name for caching version information for components
> + */
> + public static final String ADS_CACHE_VERSION_FILE = "version";
> +
> + /*
> + * IPojo Handler name for ADSComponent annotation.
> + */
> + public static final String ADS_COMPONENT_HANDLER_NS = "org.apache.directory.server.component.handler";
> +
> + /*
> + * IPojo Handler name for ADSComponent annotation.
> + */
> + public static final String ADS_COMPONENT_HANDLER_NAME = "ADSComponentHandler";
> +
> + /*
> + * IPojo Handler name for ADSComponent annotation.
> + */
> + public static final String ADS_COMPONENT_HANDLER_FULLNAME = "org.apache.directory.server.component.handler:ADSComponentHandler";
> +
> + /*
> + * iPOJO Component Type and Instance declaration header.
> + */
> + public static final String IPOJO_HEADER = "iPOJO-Components";
> +
> + /*
> + * Base OID value for ApacheDS component schemas.
> + */
> + public static final String ADS_COMPONENT_BASE_OID = "1.3.6.1.4.1.18060.0.4.4";
> +
> + /*
> + * Component type name of user defined components.
> + */
> + public static final String ADS_COMPONENT_TYPE_USER = "user";
> +
> + /*
> + * Base DN for @ADSComponent(componentType="user") component schema elements.
> + */
> + public static final String ADS_USER_COMPONENTS_SCHEMA_DN = "cn=usercomponents,ou=schema";
> +
> + /*
> + * Hash table for mapping property type name to its syntax in ApacheDS
> + */
> + public static Dictionary<String, String> syntaxMappings;
> +
> + /*
> + * Hash table for mapping property type name to its equality matching rule in ApacheDS
> + */
> + public static Dictionary<String, String> equalityMappings;
> +
> + /*
> + * Hash table for mapping property type name to its ordering rule in ApacheDS
> + */
> + public static Dictionary<String, String> orderingMappings;
> +
> + /*
> + * Hash table for mapping property type name to its substring matching in ApacheDS
> + */
> + public static Dictionary<String, String> substringMappings;
> +
> + /**
> + * Static constructor that initializes the values of the type mapping Hash tables.
> + */
> + static
> + {
> + syntaxMappings = new Hashtable<String, String>();
> + syntaxMappings.put( "int", "1.3.6.1.4.1.1466.115.121.1.27" );
> + syntaxMappings.put( "java.lang.String", "1.3.6.1.4.1.1466.115.121.1.15" );
> + syntaxMappings.put( "boolean", "1.3.6.1.4.1.1466.115.121.1.7" );
> +
> + equalityMappings = new Hashtable<String, String>();
> + equalityMappings.put( "int", "integerMatch" );
> + equalityMappings.put( "java.lang.String", "caseExactMatch" );
> + equalityMappings.put( "boolean", "booleanMatch" );
> +
> + orderingMappings = new Hashtable<String, String>();
> + orderingMappings.put( "int", "integerOrderingMatch" );
> + orderingMappings.put( "java.lang.String", "caseExactOrderingMatch" );
> + orderingMappings.put( "boolean", "caseIgnoreOrderingMatch" );
> +
> + substringMappings = new Hashtable<String, String>();
> + substringMappings.put( "int", "numericStringSubstringsMatch" );
> + substringMappings.put( "java.lang.String", "caseExactSubstringsMatch" );
> + substringMappings.put( "boolean", "caseIgnoreSubstringsMatch" );
> + }
> +
> +}
>
> Added: directory/apacheds/trunk/component-hub/src/main/java/org/apache/directory/server/component/handler/ADSComponent.java
> URL: http://svn.apache.org/viewvc/directory/apacheds/trunk/component-hub/src/main/java/org/apache/directory/server/component/handler/ADSComponent.java?rev=1203217&view=auto
> ==============================================================================
> --- directory/apacheds/trunk/component-hub/src/main/java/org/apache/directory/server/component/handler/ADSComponent.java (added)
> +++ directory/apacheds/trunk/component-hub/src/main/java/org/apache/directory/server/component/handler/ADSComponent.java Thu Nov 17 15:21:39 2011
> @@ -0,0 +1,31 @@
> +/*
> + * 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.server.component.handler;
> +
> +
> +/**
> + * Used to annotate ApacheDS components with their component type.
> + *
> + * @author <a href="mailto:dev@directory.apache.org">Apache Directory Project</a>
> + */
> +public @interface ADSComponent
> +{
> + String componentType() default "user";
> +}
>
> Added: directory/apacheds/trunk/component-hub/src/main/java/org/apache/directory/server/component/handler/ADSComponentHandler.java
> URL: http://svn.apache.org/viewvc/directory/apacheds/trunk/component-hub/src/main/java/org/apache/directory/server/component/handler/ADSComponentHandler.java?rev=1203217&view=auto
> ==============================================================================
> --- directory/apacheds/trunk/component-hub/src/main/java/org/apache/directory/server/component/handler/ADSComponentHandler.java (added)
> +++ directory/apacheds/trunk/component-hub/src/main/java/org/apache/directory/server/component/handler/ADSComponentHandler.java Thu Nov 17 15:21:39 2011
> @@ -0,0 +1,65 @@
> +/*
> + * 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.server.component.handler;
> +
> +
> +import java.util.Dictionary;
> +
> +import org.apache.felix.ipojo.ConfigurationException;
> +import org.apache.felix.ipojo.PrimitiveHandler;
> +import org.apache.felix.ipojo.annotations.Handler;
> +import org.apache.felix.ipojo.metadata.Element;
> +
> +
> +/**
> + * IPojo handler for ADSComponent annotation.
> + * It does not supposed to do anything. It is just to validate the custom-annotated component.
> + *
> + *
> + * @author <a href="mailto:dev@directory.apache.org">Apache Directory Project</a>
> + */
> +@Handler(namespace = "org.apache.directory.server.component.handler", name = "ADSComponent")
> +public class ADSComponentHandler extends PrimitiveHandler
> +{
> +
> + @Override
> + public void configure( Element metadata, Dictionary configuration ) throws ConfigurationException
> + {
> + // TODO Auto-generated method stub
> +
> + }
> +
> +
> + @Override
> + public void stop()
> + {
> + // TODO Auto-generated method stub
> +
> + }
> +
> +
> + @Override
> + public void start()
> + {
> + // TODO Auto-generated method stub
> +
> + }
> +
> +}
>
> Added: directory/apacheds/trunk/component-hub/src/main/java/org/apache/directory/server/component/hub/ComponentHub.java
> URL: http://svn.apache.org/viewvc/directory/apacheds/trunk/component-hub/src/main/java/org/apache/directory/server/component/hub/ComponentHub.java?rev=1203217&view=auto
> ==============================================================================
> --- directory/apacheds/trunk/component-hub/src/main/java/org/apache/directory/server/component/hub/ComponentHub.java (added)
> +++ directory/apacheds/trunk/component-hub/src/main/java/org/apache/directory/server/component/hub/ComponentHub.java Thu Nov 17 15:21:39 2011
> @@ -0,0 +1,418 @@
> +/*
> + * 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.server.component.hub;
> +
> +
> +import java.util.ArrayList;
> +import java.util.Dictionary;
> +import java.util.Enumeration;
> +import java.util.Hashtable;
> +import java.util.List;
> +
> +import org.apache.directory.server.component.ADSComponent;
> +import org.apache.directory.server.component.ADSConstants;
> +import org.apache.directory.server.component.hub.listener.HubListener;
> +import org.apache.directory.server.component.schema.ComponentSchemaGenerator;
> +import org.apache.directory.server.component.schema.UserComponentSchemaGenerator;
> +import org.apache.felix.ipojo.Factory;
> +import org.apache.felix.ipojo.annotations.Component;
> +import org.apache.felix.ipojo.annotations.Invalidate;
> +import org.apache.felix.ipojo.annotations.Requires;
> +import org.apache.felix.ipojo.annotations.Validate;
> +import org.apache.felix.ipojo.metadata.Element;
> +import org.apache.felix.ipojo.parser.ManifestMetadataParser;
> +import org.apache.felix.ipojo.parser.ParseException;
> +import org.apache.felix.ipojo.whiteboard.Wbp;
> +import org.apache.felix.ipojo.whiteboard.Whiteboards;
> +import org.osgi.framework.ServiceReference;
> +import org.osgi.service.log.LogService;
> +
> +
> +/**
> + * An IPojo component that listens for incoming factories and instances.
> + * Creating or destroying corresponding ADSComponent from them.
> + *
> + *
> + * @author <a href="mailto:dev@directory.apache.org">Apache Directory Project</a>
> + */
> +@Component
> +@Whiteboards(whiteboards =
> + {
> + @Wbp(onArrival = "onFactoryArrival",
> + onDeparture = "onFactoryDeparture",
> + filter = "(objectClass=org.apache.felix.ipojo.Factory)"),
> + @Wbp(onArrival = "onInstanceArrival",
> + onDeparture = "onInstanceDeparture",
> + filter = "(objectClass=org.apache.felix.ipojo.architecture.Architecture)")
> +})
> +public class ComponentHub
> +{
> + /*
> + * boolean value to check for deferred writes to schema partition
> + */
> + private boolean schemaReady = false;
> +
> + /*
> + * boolean value to check for deferred writes to config partition
> + */
> + private boolean configReady = false;
> +
> + /*
> + * Map to keep "component type" -> "components" mapping.
> + */
> + private Dictionary<String, List<ADSComponent>> componentMap;
> +
> + /*
> + * List to keep all active ApacheDS components.
> + */
> + private List<ADSComponent> components;
> +
> + /*
> + * Map to keep "component type" -> "schema generator" mapping.
> + */
> + private Dictionary<String, ComponentSchemaGenerator> schemaGenerators;
> +
> + /*
> + * Map to keep "component type" -> "listeners" mapping
> + */
> + private Dictionary<String, List<HubListener>> listenersMap;
> +
> + /*
> + * OSGI Logger
> + */
> + @Requires
> + private LogService logger;
> +
> +
> + public ComponentHub()
> + {
> + componentMap = new Hashtable<String, List<ADSComponent>>();
> + components = new ArrayList<ADSComponent>();
> +
> + schemaGenerators = new Hashtable<String, ComponentSchemaGenerator>();
> + schemaGenerators.put( ADSConstants.ADS_COMPONENT_TYPE_USER, new UserComponentSchemaGenerator() );
> +
> + listenersMap = new Hashtable<String, List<HubListener>>();
> + }
> +
> +
> + /**
> + * Called when ADSComponentHub instance is validated by IPojo
> + *
> + */
> + @Validate
> + public void hubValidated()
> + {
> + logger.log( LogService.LOG_INFO, "ADSComponentHub validated." );
> + }
> +
> +
> + /**
> + * Called when ADSComponentHub instance is invalidated by IPojo
> + *
> + */
> + @Invalidate
> + public void hubInvalidated()
> + {
> + logger.log( LogService.LOG_INFO, "ADSComponentHub validated." );
> + }
> +
> +
> + /**
> + * Factory arrival callback, registered by whiteboard handler.
> + *
> + * @param ref Reference to IPojo Factory
> + */
> + public void onFactoryArrival( ServiceReference ref )
> + {
> + Factory arrivingFactory = ( Factory ) ref.getBundle().getBundleContext().getService( ref );
> + if ( !checkIfADSComponent( arrivingFactory ) )
> + {
> + return;
> + }
> +
> + try
> + {
> + String componentType = parseComponentType( arrivingFactory );
> +
> + List<HubListener> listenersByType = listenersMap.get( componentType );
> +
> + // Fire the 'factory arrived' event on listeners.
> + if ( listenersByType != null )
> + {
> + for ( HubListener listener : listenersByType )
> + {
> + listener.onFactoryArrival( arrivingFactory );
> + }
> + }
> +
> + //Actual ADSComponent creation
> + ADSComponent component = generateADSComponent( componentType, arrivingFactory );
> +
> + // Iterate over listeners for 'component created' event. Apply the changes applied by them.
> + if ( listenersByType != null )
> + {
> + for ( HubListener listener : listenersByType )
> + {
> + ADSComponent _comp = listener.onComponentCreation( component );
> + if ( _comp != null )
> + {
> + component = _comp;
> + }
> + }
> + }
> +
> + //Keep the newly created ADSComponent reference.
> + components.add( component );
> +
> + List<ADSComponent> componentsByType = componentMap.get( componentType );
> + if ( componentsByType == null )
> + {
> + List<ADSComponent> newCompList = new ArrayList<ADSComponent>();
> + newCompList.add( component );
> + componentMap.put( componentType, newCompList );
> + }
> + else
> + {
> + componentsByType.add( component );
> + }
> +
> + }
> + catch ( ParseException e )
> + {
> + e.printStackTrace();
> + }
> +
> + }
> +
> +
> + /**
> + * Factory departure callback, registered by whiteboard handler.
> + *
> + * @param ref Reference to IPojo Factory
> + */
> + public void onFactoryDeparture( ServiceReference ref )
> + {
> + Factory leavingFactory = ( Factory ) ref.getBundle().getBundleContext().getService( ref );
> + if ( !checkIfADSComponent( leavingFactory ) )
> + {
> + return;
> + }
> +
> + try
> + {
> + String componentType = parseComponentType( leavingFactory );
> +
> + List<HubListener> listenersByType = listenersMap.get( componentType );
> +
> + // Fire the 'factory leaving' event on listeners.
> + if ( listenersByType != null )
> + {
> + for ( HubListener listener : listenersByType )
> + {
> + listener.onFactoryDeparture( leavingFactory );
> + }
> + }
> +
> + ADSComponent associatedComp = null;
> + for ( ADSComponent _comp : components )
> + {
> + if ( _comp.getFactory().getName().equals( leavingFactory.getName() ) )
> + {
> + associatedComp = _comp;
> + break;
> + }
> + }
> +
> + if ( associatedComp == null )
> + {
> + logger.log( LogService.LOG_INFO, "Couldn't found an associated ADSComponent for factory:"
> + + leavingFactory.getName() );
> + return;
> + }
> +
> + // Iterate over listeners for 'component deleting' event.
> + if ( listenersByType != null )
> + {
> + for ( HubListener listener : listenersByType )
> + {
> + listener.onComponentDeletion( associatedComp );
> + }
> + }
> +
> + // All clients are notified now cache and delete the ADSComponent existence on ApacheDS
> + cacheAndReleaseADSComponent( associatedComp );
> +
> + }
> + catch ( ParseException e )
> + {
> + e.printStackTrace();
> + }
> + }
> +
> +
> + /**
> + * IPojo instance arrival callback, registered by whiteboard handler.
> + *
> + * @param ref Reference to IPojo instance
> + */
> + public void onInstanceArrival( ServiceReference ref )
> + {
> +
> + }
> +
> +
> + /**
> + * IPojo instance departure callback, registered by whiteboard handler.
> + *
> + * @param ref Reference to IPojo instance
> + */
> + public void onInstanceDeparture( ServiceReference ref )
> + {
> +
> + }
> +
> +
> + /**
> + * Check whether the argument is ADSComponent annotated.
> + *
> + * @param factory
> + * @return
> + */
> + private boolean checkIfADSComponent( Factory factory )
> + {
> + List<String> handlers = factory.getRequiredHandlers();
> + for ( String handlerName : handlers )
> + {
> + if ( handlerName.equals( ADSConstants.ADS_COMPONENT_HANDLER_FULLNAME ) )
> + {
> + return true;
> + }
> + }
> +
> + return false;
> + }
> +
> +
> + private String parseComponentType( Factory factory ) throws ParseException
> + {
> + Dictionary bundleHeaders = factory.getBundleContext().getBundle().getHeaders();
> + String ipojoHeader = ( String ) bundleHeaders.get( ADSConstants.IPOJO_HEADER );
> +
> + if ( ipojoHeader == null )
> + {
> + throw new ParseException( "Null ipojo header returned for factory: " + factory.getName() );
> + }
> +
> + ManifestMetadataParser parser = new ManifestMetadataParser();
> + parser.parseHeader( ipojoHeader );
> +
> + Element[] componentMetas = parser.getComponentsMetadata();
> +
> + for ( Element componentMeta : componentMetas )
> + {
> + String compName = componentMeta.getAttribute( "name" );
> + if ( compName.equals( factory.getName() ) )
> + {
> + Element[] adsElements = componentMeta.getElements(
> + ADSConstants.ADS_COMPONENT_HANDLER_NAME,
> + ADSConstants.ADS_COMPONENT_HANDLER_NS );
> +
> + if ( adsElements == null || adsElements.length == 0 )
> + {
> + throw new ParseException( "ADSComponent element couldn't be found for factory: "
> + + factory.getName() );
> + }
> +
> + return adsElements[0].getAttribute( "componentType" );
> + }
> + }
> +
> + return null;
> + }
> +
> +
> + /**
> + * Generates a new ADSComponent with its schema and cache handle.
> + *
> + * @param componentType Type of a component being created
> + * @param factory a factory reference to create a ADSComponent for.
> + * @return
> + */
> + private ADSComponent generateADSComponent( String componentType, Factory factory )
> + {
> + return null;
> + }
> +
> +
> + /**
> + * Cache the ADSComponent existence on ApacheDS with all of its DIT entries. And then release it from hub.
> + *
> + * @param leavingComp ADSComponent reference to cache and release.
> + */
> + private void cacheAndReleaseADSComponent( ADSComponent leavingComp )
> + {
> +
> + }
> +
> +
> + /**
> + * Registers a HubListener for specified component type.
> + *
> + * @param componentType component type to get notifications for.
> + * @param listener HubListener implementation
> + */
> + public void registerListener( String componentType, HubListener listener )
> + {
> + List<HubListener> listenersForComp = listenersMap.get( componentType );
> + if ( listenersForComp == null )
> + {
> + ArrayList<HubListener> list = new ArrayList<HubListener>();
> + list.add( listener );
> + listenersMap.put( componentType, list );
> + }
> + else
> + {
> + if ( !listenersForComp.contains( listener ) )
> + {
> + listenersForComp.add( listener );
> + }
> + }
> + }
> +
> +
> + /**
> + * Removes the specified listener from the notification chain.
> + *
> + * @param listener HubListener implementation
> + */
> + public void removeListener( HubListener listener )
> + {
> + Enumeration<List<HubListener>> it = listenersMap.elements();
> + while ( it.hasMoreElements() )
> + {
> + List<HubListener> list = it.nextElement();
> + if ( list.contains( listener ) )
> + {
> + list.remove( listener );
> + }
> + }
> + }
> +}
>
> Added: directory/apacheds/trunk/component-hub/src/main/java/org/apache/directory/server/component/hub/listener/AbstractHubListener.java
> URL: http://svn.apache.org/viewvc/directory/apacheds/trunk/component-hub/src/main/java/org/apache/directory/server/component/hub/listener/AbstractHubListener.java?rev=1203217&view=auto
> ==============================================================================
> --- directory/apacheds/trunk/component-hub/src/main/java/org/apache/directory/server/component/hub/listener/AbstractHubListener.java (added)
> +++ directory/apacheds/trunk/component-hub/src/main/java/org/apache/directory/server/component/hub/listener/AbstractHubListener.java Thu Nov 17 15:21:39 2011
> @@ -0,0 +1,76 @@
> +/*
> + * 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.server.component.hub.listener;
> +
> +
> +import org.apache.directory.server.component.ADSComponent;
> +import org.apache.felix.ipojo.Factory;
> +
> +
> +/**
> + * Abstract HubListener implementation. Override the intended methods to receive notifications.
> + *
> + * @author <a href="mailto:dev@directory.apache.org">Apache Directory Project</a>
> + */
> +public abstract class AbstractHubListener implements HubListener
> +{
> +
> + /*
> + * (non-Javadoc)
> + * @see org.apache.directory.server.component.hub.listener.HubListener#onFactoryArrival(org.apache.felix.ipojo.Factory)
> + */
> + @Override
> + public void onFactoryArrival( Factory factory )
> + {
> + }
> +
> +
> + /*
> + * (non-Javadoc)
> + * @see org.apache.directory.server.component.hub.listener.HubListener#onFactoryDeparture(org.apache.felix.ipojo.Factory)
> + */
> + @Override
> + public void onFactoryDeparture( Factory factory )
> + {
> +
> + }
> +
> +
> + /*
> + * (non-Javadoc)
> + * @see org.apache.directory.server.component.hub.listener.HubListener#onComponentCreation(org.apache.directory.server.component.ADSComponent)
> + */
> + @Override
> + public ADSComponent onComponentCreation( ADSComponent component )
> + {
> + return null;
> + }
> +
> +
> + /*
> + * (non-Javadoc)
> + * @see org.apache.directory.server.component.hub.listener.HubListener#onComponentDeletion(org.apache.directory.server.component.ADSComponent)
> + */
> + @Override
> + public void onComponentDeletion( ADSComponent component )
> + {
> + }
> +
> +}
>
> Added: directory/apacheds/trunk/component-hub/src/main/java/org/apache/directory/server/component/hub/listener/HubListener.java
> URL: http://svn.apache.org/viewvc/directory/apacheds/trunk/component-hub/src/main/java/org/apache/directory/server/component/hub/listener/HubListener.java?rev=1203217&view=auto
> ==============================================================================
> --- directory/apacheds/trunk/component-hub/src/main/java/org/apache/directory/server/component/hub/listener/HubListener.java (added)
> +++ directory/apacheds/trunk/component-hub/src/main/java/org/apache/directory/server/component/hub/listener/HubListener.java Thu Nov 17 15:21:39 2011
> @@ -0,0 +1,73 @@
> +/*
> + * 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.server.component.hub.listener;
> +
> +
> +import org.apache.directory.server.component.ADSComponent;
> +import org.apache.felix.ipojo.Factory;
> +import org.apache.felix.ipojo.architecture.Architecture;
> +
> +
> +/**
> + * Interface for the classes those want to be notified of ComponentHub.
> + * Listeners can bind themselves using ComponentHub.registerListener() method,
> + * and can remove themselves using ComponentHub.removeListener() method.
> + * TODO HubListener.
> + *
> + * @author <a href="mailto:dev@directory.apache.org">Apache Directory Project</a>
> + */
> +public interface HubListener
> +{
> + /**
> + * Notified when a new factory is sniffed by Hub.
> + *
> + * @param factory arriving factory
> + */
> + public void onFactoryArrival( Factory factory );
> +
> +
> + /**
> + * Notified when a factory leaving the container.
> + *
> + * @param factory departuring factory
> + */
> + public void onFactoryDeparture( Factory factory );
> +
> +
> + /**
> + * Notified when a new ADSComponent is created.
> + * Listener can change the newly created ADSComponent by returning changed ADSComponent.(Be cautious)
> + *
> + * @param component newly created ADSComponent
> + * @return the overrided version of the ADSComponent or null if no change is intended.
> + */
> + public ADSComponent onComponentCreation( ADSComponent component );
> +
> +
> + /**
> + * Notified when a new ADSComponent is about to be disposed.
> + * Called before component disposal begins.
> + *
> + * @param component disposing created ADSComponent
> + * @return the overrided version of the ADSComponent or null if no change is intended.
> + */
> + public void onComponentDeletion( ADSComponent component );
> +
> +}
>
> Added: directory/apacheds/trunk/component-hub/src/main/java/org/apache/directory/server/component/schema/ADSComponentSchema.java
> URL: http://svn.apache.org/viewvc/directory/apacheds/trunk/component-hub/src/main/java/org/apache/directory/server/component/schema/ADSComponentSchema.java?rev=1203217&view=auto
> ==============================================================================
> --- directory/apacheds/trunk/component-hub/src/main/java/org/apache/directory/server/component/schema/ADSComponentSchema.java (added)
> +++ directory/apacheds/trunk/component-hub/src/main/java/org/apache/directory/server/component/schema/ADSComponentSchema.java Thu Nov 17 15:21:39 2011
> @@ -0,0 +1,103 @@
> +/*
> + * 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.server.component.schema;
> +
> +
> +import java.util.ArrayList;
> +import java.util.List;
> +
> +import org.apache.directory.shared.ldap.model.ldif.LdifEntry;
> +
> +
> +/**
> + * Class that represents an ADSComponent's schema definition.
> + *
> + * @author <a href="mailto:dev@directory.apache.org">Apache Directory Project</a>
> + */
> +public class ADSComponentSchema
> +{
> + /*
> + * Schema elements (attribs,ocs) for component.
> + */
> + private List<LdifEntry> schemaElements = null;
> +
> + /*
> + * True if the @schemaElements contains complete schema definition with schema entry.
> + */
> + private boolean completeSchema = false;
> +
> + /*
> + * Schema name which @schemaElements will go under.
> + */
> + private String parentSchemaDn = null;
> +
> +
> + public ADSComponentSchema( String name, List<LdifEntry> elements )
> + {
> + this( name, elements, false );
> + }
> +
> +
> + public ADSComponentSchema( String parentSchema, List<LdifEntry> elements, boolean complete )
> + {
> + parentSchemaDn = parentSchema;
> + schemaElements = elements;
> + completeSchema = complete;
> + }
> +
> +
> + /**
> + * Getter for completeSchema
> + *
> + * @return true if schema is complete with schema entry.
> + */
> + public boolean ifCompleteSchema()
> + {
> + return completeSchema;
> + }
> +
> +
> + /**
> + * Returns name of the schema
> + *
> + * @return name of the schema
> + */
> + public String getParentSchemaName()
> + {
> + return parentSchemaDn;
> + }
> +
> +
> + /**
> + * Gets the clone of the schema elements.
> + *
> + * @return clone of the schema elements.
> + */
> + public List<LdifEntry> getSchemaElements()
> + {
> + if ( schemaElements == null )
> + {
> + return null;
> + }
> +
> + return new ArrayList<LdifEntry>( schemaElements );
> + }
> +
> +}
>
> Added: directory/apacheds/trunk/component-hub/src/main/java/org/apache/directory/server/component/schema/ComponentOIDGenerator.java
> URL: http://svn.apache.org/viewvc/directory/apacheds/trunk/component-hub/src/main/java/org/apache/directory/server/component/schema/ComponentOIDGenerator.java?rev=1203217&view=auto
> ==============================================================================
> --- directory/apacheds/trunk/component-hub/src/main/java/org/apache/directory/server/component/schema/ComponentOIDGenerator.java (added)
> +++ directory/apacheds/trunk/component-hub/src/main/java/org/apache/directory/server/component/schema/ComponentOIDGenerator.java Thu Nov 17 15:21:39 2011
> @@ -0,0 +1,88 @@
> +/*
> + * 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.server.component.schema;
> +
> +
> +import org.apache.directory.server.component.ADSConstants;
> +
> +
> +/**
> + * This is a simple incremental generator for OID assignments of custom generated schemas.
> + * Ensuring consistency among different servers on the cluster will be replication layer's duty.
> + * TODO ADSComponentOIDGenerator.
> + *
> + * @author <a href="mailto:dev@directory.apache.org">Apache Directory Project</a>
> + */
> +public class ComponentOIDGenerator
> +{
> + /*
> + * Base OID to generate sequential OIDs against.
> + */
> + private static String baseOID = null;
> +
> + /*
> + * Counters to keep track.
> + */
> + private static int componentCounter;
> + private static int ocCounter;
> + private static int attribCounter;
> +
> + static
> + {
> + baseOID = ADSConstants.ADS_COMPONENT_BASE_OID;
> +
> + componentCounter = 0;
> + ocCounter = 0;
> + attribCounter = 0;
> + }
> +
> +
> + /**
> + * Returns OID for component
> + *
> + * @return oid for component
> + */
> + public static synchronized String generateComponentOID()
> + {
> + return baseOID + "." + ( ++componentCounter );
> + }
> +
> +
> + /**
> + * Returns OID for object class under specified component base OID.
> + *
> + * @return oid for object class
> + */
> + public static synchronized String generateOCOID( String componentBase )
> + {
> + return componentBase + ".1." + ( ++ocCounter );
> + }
> +
> +
> + /**
> + * Returns OID for attribute under specified component base OID.
> + *
> + * @return oid for attribute
> + */
> + public static synchronized String generateAttribOID( String componentBase )
> + {
> + return componentBase + ".2." + ( ++attribCounter );
> + }
> +}
>
> Added: directory/apacheds/trunk/component-hub/src/main/java/org/apache/directory/server/component/schema/ComponentSchemaGenerator.java
> URL: http://svn.apache.org/viewvc/directory/apacheds/trunk/component-hub/src/main/java/org/apache/directory/server/component/schema/ComponentSchemaGenerator.java?rev=1203217&view=auto
> ==============================================================================
> --- directory/apacheds/trunk/component-hub/src/main/java/org/apache/directory/server/component/schema/ComponentSchemaGenerator.java (added)
> +++ directory/apacheds/trunk/component-hub/src/main/java/org/apache/directory/server/component/schema/ComponentSchemaGenerator.java Thu Nov 17 15:21:39 2011
> @@ -0,0 +1,44 @@
> +/*
> + * 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.server.component.schema;
> +
> +
> +import org.apache.felix.ipojo.Factory;
> +
> +
> +/**
> + * Interface for classes generating schemas for component types.
> + *
> + * @author <a href="mailto:dev@directory.apache.org">Apache Directory Project</a>
> + */
> +public interface ComponentSchemaGenerator
> +{
> + /**
> + * Generates a schema for representing all of factory's configurables.
> + * Returned schema is in right order to add it to LDAP without any sorting.
> + *
> + * If factory does not need a custom schema, it does not generate a schema for
> + * it, just returns the name of stock schema instead.
> + *
> + * @param factory Factory reference to generate schema for.
> + * @return Schema in the form of LdifEntry list.
> + */
> + public ADSComponentSchema generateOrGetSchemaElements( Factory factory );
> +}
>
> Added: directory/apacheds/trunk/component-hub/src/main/java/org/apache/directory/server/component/schema/UserComponentSchemaGenerator.java
> URL: http://svn.apache.org/viewvc/directory/apacheds/trunk/component-hub/src/main/java/org/apache/directory/server/component/schema/UserComponentSchemaGenerator.java?rev=1203217&view=auto
> ==============================================================================
> --- directory/apacheds/trunk/component-hub/src/main/java/org/apache/directory/server/component/schema/UserComponentSchemaGenerator.java (added)
> +++ directory/apacheds/trunk/component-hub/src/main/java/org/apache/directory/server/component/schema/UserComponentSchemaGenerator.java Thu Nov 17 15:21:39 2011
> @@ -0,0 +1,157 @@
> +/*
> + * 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.server.component.schema;
> +
> +
> +import java.util.ArrayList;
> +import java.util.List;
> +
> +import org.apache.directory.server.component.ADSConstants;
> +import org.apache.directory.shared.ldap.model.exception.LdapInvalidAttributeValueException;
> +import org.apache.directory.shared.ldap.model.exception.LdapInvalidDnException;
> +import org.apache.directory.shared.ldap.model.ldif.LdapLdifException;
> +import org.apache.directory.shared.ldap.model.ldif.LdifEntry;
> +import org.apache.felix.ipojo.Factory;
> +import org.apache.felix.ipojo.architecture.PropertyDescription;
> +import org.slf4j.Logger;
> +import org.slf4j.LoggerFactory;
> +
> +
> +public class UserComponentSchemaGenerator implements ComponentSchemaGenerator
> +{
> +
> + private static final Logger LOG = LoggerFactory.getLogger( UserComponentSchemaGenerator.class );
> +
> +
> + @Override
> + public ADSComponentSchema generateOrGetSchemaElements( Factory componentFactory )
> + {
> + List<LdifEntry> schemaElements = new ArrayList<LdifEntry>();
> +
> + String componentName = componentFactory.getName();
> + if ( componentName.contains( "." ) )
> + {
> + componentName = componentName.substring( componentName.lastIndexOf( '.' ) + 1 );
> + }
> +
> + String schemaDn = ADSConstants.ADS_USER_COMPONENTS_SCHEMA_DN;
> +
> + String attribsDn = "ou=attributeTypes," + schemaDn;
> + String ocsDn = "ou=objectClasses," + schemaDn;
> +
> + //Will hold the m-must attributes while iterating over properties of the component
> + List<String> ocAttribs = new ArrayList<String>();
> +
> + // Creating schema elements with proper order and pushing them into the list
> + try
> + {
> +
> + String componentBaseOID = ComponentOIDGenerator.generateComponentOID();
> +
> + for ( PropertyDescription prop : componentFactory.getComponentDescription().getProperties() )
> + {
> +
> + //Must be lower case, alphanumeric only
> + String propname = prop.getName();
> +
> + String proptype = prop.getType();
> + String propoid = ComponentOIDGenerator.generateAttribOID( componentBaseOID );
> + String propdn = "m-oid=" + propoid + "," + attribsDn;
> +
> + if ( !( proptype.equals( "int" ) || proptype.equals( "java.lang.String" ) || proptype
> + .equals( "boolean" ) ) )
> + {
> + LOG.info( "Property found with an incompatible type: "
> + + propname + ":" + proptype );
> + continue;
> + }
> +
> + String syntax = ADSConstants.syntaxMappings.get( proptype );
> + String equality = ADSConstants.equalityMappings.get( proptype );
> + String ordering = ADSConstants.orderingMappings.get( proptype );
> + String substr = ADSConstants.substringMappings.get( proptype );
> +
> + schemaElements.add( new LdifEntry( propdn,
> + "objectclass:metaAttributeType",
> + "objectclass:metaTop",
> + "objectclass:top",
> + "m-oid:" + propoid,
> + "m-name:" + propname,
> + "m-description:Property of component type " + componentName,
> + "m-equality:" + equality,
> + "m-ordering:" + ordering,
> + "m-substr:" + substr,
> + "m-syntax:" + syntax,
> + "m-length:0",
> + "m-singleValue:TRUE" ) );
> +
> + if ( prop.isMandatory() )
> + {
> + ocAttribs.add( "m-must:" + propname );
> + }
> + else
> + {
> + ocAttribs.add( "m-may:" + propname );
> + }
> +
> + }
> +
> + schemaElements.add( new LdifEntry( ocsDn,
> + "objectclass:organizationalUnit",
> + "objectClass:top",
> + "ou:objectClasses" ) );
> +
> + String ocoid = ComponentOIDGenerator.generateOCOID( componentBaseOID );
> + String ocDn = "m-oid=" + ocoid + "," + ocsDn;
> +
> + ocAttribs.add( 0, "m-may:cached" );
> + ocAttribs.add( 0, "m-must:ins" );
> + ocAttribs.add( 0, "m-must:active" );
> + ocAttribs.add( 0, "m-supObjectClass: top" );
> + ocAttribs.add( 0, "m-description:Object Class for generating instances of:" + componentName );
> + ocAttribs.add( 0, "m-name:" + componentName );
> + ocAttribs.add( 0, "m-oid:" + ocoid );
> + ocAttribs.add( 0, "objectclass: top" );
> + ocAttribs.add( 0, "objectclass: metaTop" );
> + ocAttribs.add( 0, "objectclass: metaObjectClass" );
> +
> + schemaElements.add( new LdifEntry( ocDn, ocAttribs.toArray() ) );
> +
> + }
> + catch ( LdapInvalidAttributeValueException e )
> + {
> + LOG.info( "ADSSchemaManager#generateSchema: Error(LdapInvalidAttributeValueException) while creating LdifEntry for: "
> + + componentFactory );
> + }
> + catch ( LdapInvalidDnException e )
> + {
> + LOG.info( "ADSSchemaManager#generateSchema: Error(LdapInvalidDnException) while creating LdifEntry for: "
> + + componentFactory );
> + }
> + catch ( LdapLdifException e )
> + {
> + LOG.info( "ADSSchemaManager#generateSchema: Error(LdapLdifException) while creating LdifEntry for: "
> + + componentFactory );
> + }
> +
> + return new ADSComponentSchema( ADSConstants.ADS_USER_COMPONENTS_SCHEMA_DN, schemaElements );
> + }
> +
> +}
>
> Modified: directory/apacheds/trunk/pom.xml
> URL: http://svn.apache.org/viewvc/directory/apacheds/trunk/pom.xml?rev=1203217&r1=1203216&r2=1203217&view=diff
> ==============================================================================
> --- directory/apacheds/trunk/pom.xml (original)
> +++ directory/apacheds/trunk/pom.xml Thu Nov 17 15:21:39 2011
> @@ -151,6 +151,7 @@
> <module>apache-felix</module>
> <module>dependencies</module>
> <module>service-osgi</module>
> + <module>component-hub</module>
> </modules>
>
> <build>
>
>