OW2 Consortium
Search OW2 Mail Archive: 

Advanced Search - Powered by Google


Mail Archive Home | fractal-commits List | March 2006 Index

<--  Date Index  --> <--  Thread Index  -->

CVS update of web (25 files)


    Date: Thursday, March 30, 2006 @ 11:33:08
  Author: seintur
    Path: /cvsroot/fractal/web

   Added: html/tutorials/aokell/examples/ALoggerController.aj
          html/tutorials/aokell/examples/BasicLoggerControllerImpl.java
          html/tutorials/aokell/examples/Controller.java
          html/tutorials/aokell/examples/DreamLogType.java
          html/tutorials/aokell/examples/LoggerController.fractal
          html/tutorials/aokell/examples/LoggerControllerItf.java
          html/tutorials/aokell/examples/LoggerControllerProcessor.java
          html/tutorials/aokell/examples/LoggerControllerTemplate.java
          html/tutorials/aokell/examples/LoggerControllerType.fractal
          html/tutorials/aokell/examples/Primitive.fractal
          html/tutorials/aokell/examples/tutorial.zip
          html/tutorials/aokell/figures/bootstrapComponent.jpg
          html/tutorials/aokell/figures/componentStructure.jpg
          html/tutorials/aokell/figures/componentizedMembranes.jpg
          html/tutorials/aokell/figures/controlLayers.jpg
          html/tutorials/aokell/figures/flatMembrane.jpg
          html/tutorials/aokell/figures/markerTypeSystem.jpg
          html/tutorials/aokell/figures/packages.jpg
          html/tutorials/aokell/figures/twoLevels.jpg
          html/tutorials/aokell/overview.html
          xml/root/tutorials/aokell/index-holder.xml
Modified: postprocess.sh xml/root/doc/index.xml
          xml/root/download/index.xml xml/root/index.xml

Committing AOKell documentation in the CVS repository containing the web site 
sources.


---------------------------------------------------------------+
 html/tutorials/aokell/examples/ALoggerController.aj           |   86 
 html/tutorials/aokell/examples/BasicLoggerControllerImpl.java |  298 ++
 html/tutorials/aokell/examples/Controller.java                |   60 
 html/tutorials/aokell/examples/DreamLogType.java              |   39 
 html/tutorials/aokell/examples/LoggerController.fractal       |   34 
 html/tutorials/aokell/examples/LoggerControllerItf.java       |   27 
 html/tutorials/aokell/examples/LoggerControllerProcessor.java |   53 
 html/tutorials/aokell/examples/LoggerControllerTemplate.java  |   99 
 html/tutorials/aokell/examples/LoggerControllerType.fractal   |   33 
 html/tutorials/aokell/examples/Primitive.fractal              |   68 
 html/tutorials/aokell/examples/tutorial.zip                   |    <<Binary 
file>>
 html/tutorials/aokell/figures/bootstrapComponent.jpg          |    <<Binary 
file>>
 html/tutorials/aokell/figures/componentStructure.jpg          |    <<Binary 
file>>
 html/tutorials/aokell/figures/componentizedMembranes.jpg      |    <<Binary 
file>>
 html/tutorials/aokell/figures/controlLayers.jpg               |    <<Binary 
file>>
 html/tutorials/aokell/figures/flatMembrane.jpg                |    <<Binary 
file>>
 html/tutorials/aokell/figures/markerTypeSystem.jpg            |    <<Binary 
file>>
 html/tutorials/aokell/figures/packages.jpg                    |    <<Binary 
file>>
 html/tutorials/aokell/figures/twoLevels.jpg                   |    <<Binary 
file>>
 html/tutorials/aokell/overview.html                           | 1311 
++++++++++
 postprocess.sh                                                |    4 
 xml/root/doc/index.xml                                        |   20 
 xml/root/download/index.xml                                   |    1 
 xml/root/index.xml                                            |    4 
 xml/root/tutorials/aokell/index-holder.xml                    |   17 
 25 files changed, 2158 insertions(+), 5 deletions(-)


Index: web/html/tutorials/aokell/examples/ALoggerController.aj
diff -u /dev/null web/html/tutorials/aokell/examples/ALoggerController.aj:1.1
--- /dev/null   Thu Mar 30 11:33:08 2006
+++ web/html/tutorials/aokell/examples/ALoggerController.aj     Thu Mar 30 
11:33:06 2006
@@ -0,0 +1,86 @@
+/***
+ * AOKell
+ * Copyright (C) 2005 INRIA, France Telecom
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+ *
+ * Contact: Lionel.Seinturier@xxxxxxx
+ *
+ * Author: Lionel Seinturier
+ */
+
+package org.objectweb.fractal.aokell.glue;
+
+/**
+ * This aspect introduces the features provided by the logger controller.
+ * These features are introduced for all classes that implement the
+ * LoggerType marker interface.
+ * 
+ * @author Lionel Seinturier <Lionel.Seinturier@xxxxxxx>
+ */
+
+import aokell.dream.lib.control.logger.LoggerControllerItf;
+import aokell.dream.lib.membrane.marker.LoggerType;
+import aokell.lib.util.MFractalHelper;
+
+import org.objectweb.dream.control.logger.Loggable;
+
+public aspect ALoggerController {
+        
+    // -----------------------------------------------------------
+    // Introduction of the LoggerController interface
+    // Delegate calls to an instance
+    // -----------------------------------------------------------
+    
+    public void LoggerType.setBaseName(String name) {
+        LoggerControllerItf _loggerc = (LoggerControllerItf) 
MFractalHelper.lookupFcController(getFcMembrane(),"logger-controller");
+        _loggerc.setBaseName(name);
+    }
+
+    public String LoggerType.getBaseName() {
+        LoggerControllerItf _loggerc = (LoggerControllerItf) 
MFractalHelper.lookupFcController(getFcMembrane(),"logger-controller");
+        return _loggerc.getBaseName();
+    }
+
+    public int LoggerType.getLoggerLevel(String loggerName) {
+        LoggerControllerItf _loggerc = (LoggerControllerItf) 
MFractalHelper.lookupFcController(getFcMembrane(),"logger-controller");
+        return _loggerc.getLoggerLevel(loggerName);
+    }
+
+    public void LoggerType.setLoggerLevel(String loggerName, int level) {
+        LoggerControllerItf _loggerc = (LoggerControllerItf) 
MFractalHelper.lookupFcController(getFcMembrane(),"logger-controller");
+        _loggerc.setLoggerLevel(loggerName,level);
+    }
+
+    public String[] LoggerType.getLoggerNames() {
+        LoggerControllerItf _loggerc = (LoggerControllerItf) 
MFractalHelper.lookupFcController(getFcMembrane(),"logger-controller");
+        return _loggerc.getLoggerNames();
+    }
+    
+    // -----------------------------------------------------------
+    // Introduction of the LoggerControllerRegister interface
+    // -----------------------------------------------------------
+    
+    public void LoggerType.register(String loggerName, Loggable loggable) {
+        LoggerControllerItf _loggerc = (LoggerControllerItf) 
MFractalHelper.lookupFcController(getFcMembrane(),"logger-controller");
+        _loggerc.register(loggerName,loggable);
+    }
+
+    public void LoggerType.unregiser(String loggerName, Loggable loggable) {
+        LoggerControllerItf _loggerc = (LoggerControllerItf) 
MFractalHelper.lookupFcController(getFcMembrane(),"logger-controller");
+        _loggerc.unregiser(loggerName,loggable);
+    }
+
+}
Index: web/html/tutorials/aokell/examples/BasicLoggerControllerImpl.java
diff -u /dev/null 
web/html/tutorials/aokell/examples/BasicLoggerControllerImpl.java:1.1
--- /dev/null   Thu Mar 30 11:33:08 2006
+++ web/html/tutorials/aokell/examples/BasicLoggerControllerImpl.java   Thu 
Mar 30 11:33:06 2006
@@ -0,0 +1,298 @@
+/**
+ * Dream
+ * Copyright (C) 2003-2004 INRIA Rhone-Alpes
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+ *
+ * Contact: dream@xxxxxxxxxxxxx
+ *
+ * Initial developer(s): Matthieu Leclercq
+ * Contributor(s): Lionel Seinturier
+ */
+
+package org.objectweb.fractal.aokell.dream.lib.control.logger;
+
+import java.util.HashMap;
+import java.util.HashSet;
+import java.util.Iterator;
+import java.util.Map;
+import java.util.Set;
+
+import org.objectweb.dream.control.logger.Loggable;
+import org.objectweb.dream.control.logger.LoggerControllerRegister;
+import org.objectweb.dream.control.logger.Util;
+import org.objectweb.fractal.api.Component;
+import org.objectweb.fractal.api.Type;
+import org.objectweb.util.monolog.Monolog;
+import org.objectweb.util.monolog.api.BasicLevel;
+import org.objectweb.util.monolog.api.Logger;
+
+import org.objectweb.fractal.aokell.lib.control.CloneCtrlException;
+import org.objectweb.fractal.aokell.lib.control.Controller;
+import org.objectweb.fractal.aokell.lib.membrane.Membrane;
+
+/**
+ * Basic implementation of logger controller. A 
<code>"monolog-conf-file"</code>
+ * initialisation parameter can be set to specify the location of the monolog
+ * configuration file.
+ */
+public class BasicLoggerControllerImpl
+    implements LoggerControllerItf, Controller
+{
+
+  String baseName;
+
+  /** Map associating logger name and list of registred loggables */
+  Map    registrations;
+  /** Map associating logger name and logger instance */
+  Map    loggers;
+  Logger baseLogger;
+  
+  
+  public BasicLoggerControllerImpl() {
+      initFcController();
+  }
+  
+  private void initFcController() {
+      
+      String monologConfFile = "etc/monolog.properties";
+      if (Monolog.monologFactory == Monolog.getDefaultMonologFactory())
+      {
+        Monolog.getMonologFactory(monologConfFile);
+      }
+      
+      baseName = Util.getNextUnnamedBaseName();
+      registrations = new HashMap();
+      loggers = new HashMap();
+  }
+
+  // 
-------------------------------------------------------------------------
+  // Fields and methods added and overriden by the mixin class
+  // 
-------------------------------------------------------------------------
+
+  /**
+   * @see LoggerControllerItf#getBaseName()
+   */
+  public String getBaseName()
+  {
+    return baseName;
+  }
+
+  /**
+   * @see LoggerControllerItf#setBaseName(String)
+   */
+  public void setBaseName(String name)
+  {
+    this.baseName = name;
+    baseNameChanged();
+  }
+
+  /**
+   * @see LoggerControllerItf#getLoggerLevel(String)
+   */
+  public int getLoggerLevel(String loggerName)
+  {
+    Logger l = (Logger) loggers.get(loggerName);
+    if (l == null)
+    {
+      if (loggerName == null)
+      {
+        if (baseLogger == null)
+        {
+          baseLogger = Monolog.monologFactory.getLogger(baseName);
+        }
+        l = baseLogger;
+      }
+      else
+      {
+        return INHERIT;
+      }
+    }
+    int i = l.getCurrentIntLevel();
+    if (i == BasicLevel.DEBUG)
+      return DEBUG;
+    if (i == BasicLevel.INFO)
+      return INFO;
+    if (i == BasicLevel.WARN)
+      return WARN;
+    if (i == BasicLevel.ERROR)
+      return ERROR;
+    if (i == BasicLevel.FATAL)
+      return FATAL;
+    if (i == BasicLevel.INHERIT)
+      return INHERIT;
+    throw new IllegalStateException("Unknown logger level : " + i);
+  }
+
+  /**
+   * @see LoggerControllerItf#setLoggerLevel(String, int)
+   */
+  public void setLoggerLevel(String loggerName, int level)
+  {
+    Logger l = (Logger) loggers.get(loggerName);
+    if (l == null)
+    {
+      if (loggerName == null)
+      {
+        if (baseLogger == null)
+        {
+          baseLogger = Monolog.monologFactory.getLogger(baseName);
+        }
+        l = baseLogger;
+      }
+      else
+      {
+        return;
+      }
+    }
+    switch (level)
+    {
+      case DEBUG :
+        l.setLevel(BasicLevel.LEVEL_DEBUG);
+        break;
+      case INFO :
+        l.setLevel(BasicLevel.LEVEL_INFO);
+        break;
+      case WARN :
+        l.setLevel(BasicLevel.LEVEL_WARN);
+        break;
+      case ERROR :
+        l.setLevel(BasicLevel.LEVEL_ERROR);
+        break;
+      case FATAL :
+        l.setLevel(BasicLevel.LEVEL_FATAL);
+        break;
+      case INHERIT :
+        l.setLevel(BasicLevel.LEVEL_INHERIT);
+        break;
+      default :
+        throw new IllegalArgumentException("Unknown level " + level);
+    }
+  }
+
+  /**
+   * @see LoggerControllerItf#getLoggerNames()
+   */
+  public String[] getLoggerNames()
+  {
+    return (String[]) loggers.keySet().toArray(new String[loggers.size()]);
+  }
+
+  /**
+   * @see LoggerControllerRegister#register(String, Loggable)
+   */
+  public void register(String loggerName, Loggable loggable)
+  {
+    Set s = (Set) registrations.get(loggerName);
+    if (s == null)
+    {
+      s = new HashSet();
+      registrations.put(loggerName, s);
+    }
+    s.add(loggable);
+    giveLogger(loggerName, loggable);
+  }
+
+  /**
+   * @see LoggerControllerRegister#unregiser(String, Loggable)
+   */
+  public void unregiser(String loggerName, Loggable loggable)
+  {
+    Set s = (Set) registrations.get(loggerName);
+    if (s == null)
+    {
+      return;
+    }
+    s.remove(loggable);
+    if (s.isEmpty())
+    {
+      // no more registration for this logger, remove reference to it, for
+      // garbage collector
+      registrations.remove(loggerName);
+      loggers.remove(loggerName);
+    }
+  }
+
+  // 
---------------------------------------------------------------------------
+  // Utility methods
+  // 
---------------------------------------------------------------------------
+
+  void baseNameChanged()
+  {
+    loggers.clear();
+    Iterator iter = registrations.entrySet().iterator();
+    while (iter.hasNext())
+    {
+      Map.Entry entry = (Map.Entry) iter.next();
+      String loggerName = (String) entry.getKey();
+      Set loggables = (Set) entry.getValue();
+      Iterator iter2 = loggables.iterator();
+      while (iter2.hasNext())
+      {
+        Loggable loggable = (Loggable) iter2.next();
+        giveLogger(loggerName, loggable);
+      }
+    }
+  }
+
+  void giveLogger(String loggerName, Loggable loggable)
+  {
+    Logger logger = (Logger) loggers.get(loggerName);
+    if (logger == null)
+    {
+      String name;
+      if (loggerName == null)
+      {
+        name = baseName;
+      }
+      else
+      {
+        name = baseName + "." + loggerName;
+      }
+      logger = Monolog.monologFactory.getLogger(name);
+      loggers.put(loggerName, logger);
+    }
+    loggable.setLogger(loggerName, logger);
+  }
+
+  // --------------------------------------------------------------
+  // Controller interface
+  // --------------------------------------------------------------
+  
+  /**
+   * Initialize the controller.
+   * 
+   * @param membrane  the membrane which contains the controller
+   */
+  public void initFcCtrl( Membrane membrane ) {
+      // Indeed nothing
+  }
+  
+  /**
+   * Clone the controller state from the current component to another one.
+   * This method may receive some hints on how to do this, or provide some
+   * hints on how this has been done. For instance, the hints may be a map
+   * that is read and/or written by the controller. The raison d'être of
+   * these hints is that when its state is cloned, a controller may produce
+   * results that are needed by other controllers.
+   * 
+   * @param dst    the destination component
+   * @param hints  hints for performing the operation
+   */
+  public void cloneFcCtrl( Component dst, Object hints )
+  throws CloneCtrlException {
+      // Indeed nothing for the component controller
+  }
+}
Index: web/html/tutorials/aokell/examples/Controller.java
diff -u /dev/null web/html/tutorials/aokell/examples/Controller.java:1.1
--- /dev/null   Thu Mar 30 11:33:08 2006
+++ web/html/tutorials/aokell/examples/Controller.java  Thu Mar 30 11:33:06 
2006
@@ -0,0 +1,60 @@
+/***
+ * AOKell
+ * Copyright (C) 2005 INRIA, France Telecom
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+ *
+ * Contact: Lionel.Seinturier@xxxxxxx
+ *
+ * Author: Lionel Seinturier
+ */
+
+package org.objectweb.fractal.aokell.lib.control;
+
+import org.objectweb.fractal.api.Component;
+
+/**
+ * Interface for defining a controller.
+ * 
+ * @author Lionel Seinturier <Lionel.Seinturier@xxxxxxx>
+ */
+public interface Controller {
+
+    /**
+     * Set the reference towards the component controller associated to this
+     * controller.
+     */
+    public void setFcCompCtrl( Component compctrl );
+    
+    /**
+     * Initialize the controller.
+     */
+    public void initFcCtrl();
+    
+    /**
+     * Clone the controller state from the current component to another one.
+     * This method may receive some hints on how to do this, or provide some
+     * hints on how this has been done. For instance, the hints may be a map
+     * that is read and/or written by the controller. The raison d'etre of
+     * these hints is that when its state is cloned, a controller may produce
+     * results that are needed by other controllers.
+     * 
+     * @param dst    the destination component
+     * @param hints  hints for performing the operation
+     */
+    public void cloneFcCtrl( Component dst, Object hints )
+    throws CloneCtrlException;
+    
+}
Index: web/html/tutorials/aokell/examples/DreamLogType.java
diff -u /dev/null web/html/tutorials/aokell/examples/DreamLogType.java:1.1
--- /dev/null   Thu Mar 30 11:33:08 2006
+++ web/html/tutorials/aokell/examples/DreamLogType.java        Thu Mar 30 
11:33:06 2006
@@ -0,0 +1,39 @@
+/***
+ * AOKell
+ * Copyright (C) 2005 INRIA, France Telecom
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+ *
+ * Contact: Lionel.Seinturier@xxxxxxx
+ *
+ * Author: Lionel Seinturier
+ */
+
+package org.objectweb.fractal.aokell.dream.lib.control.logger;
+
+import org.objectweb.fractal.aokell.lib.membrane.BaseType;
+
+/**
+ * Marker type for components with a Logger controller.
+ * 
+ * @author Lionel Seinturier <Lionel.Seinturier@xxxxxxx>
+ */
+public interface DreamLogType
+    extends
+        BaseType,
+        LoggerType
+{
+
+}
Index: web/html/tutorials/aokell/examples/LoggerController.fractal
diff -u /dev/null 
web/html/tutorials/aokell/examples/LoggerController.fractal:1.1
--- /dev/null   Thu Mar 30 11:33:08 2006
+++ web/html/tutorials/aokell/examples/LoggerController.fractal Thu Mar 30 
11:33:06 2006
@@ -0,0 +1,34 @@
+<?xml version="1.0" encoding="ISO-8859-1" ?>
+<!DOCTYPE definition PUBLIC "-//objectweb.org//DTD Fractal ADL 2.0//EN" 
"classpath://org/objectweb/fractal/adl/xml/standard.dtd">
+
+<!--
+ * AOKell
+ * Copyright (C) 2005 INRIA, France Telecom
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+ *
+ * Contact: Lionel.Seinturier@xxxxxxx
+ *
+ * Author: Lionel Seinturier
+ -->
+
+<definition
+       
name="org.objectweb.fractal.aokell.dream.lib.control.logger.LoggerController"
+       
extends="org.objectweb.fractal.aokell.dream.lib.control.logger.LoggerControllerType"
 >
+       
+       <content 
class="org.objectweb.fractal.aokell.dream.lib.control.logger.BasicLoggerControllerImpl"
 />
+       
+       <controller desc="mPrimitive" />
+</definition>
Index: web/html/tutorials/aokell/examples/LoggerControllerItf.java
diff -u /dev/null 
web/html/tutorials/aokell/examples/LoggerControllerItf.java:1.1
--- /dev/null   Thu Mar 30 11:33:08 2006
+++ web/html/tutorials/aokell/examples/LoggerControllerItf.java Thu Mar 30 
11:33:06 2006
@@ -0,0 +1,27 @@
+package org.objectweb.fractal.aokell.dream.lib.control.logger;
+
+import org.objectweb.dream.control.logger.LoggerController;
+import org.objectweb.dream.control.logger.LoggerControllerRegister;
+import org.objectweb.fractal.aokell.lib.type.InterfaceTypeImpl;
+import org.objectweb.fractal.api.type.InterfaceType;
+
+/**
+ * Unified interface for LoggerControllerRegister and LoggerController.
+ * Both interfaces are implemented by BasicLoggerControllerImpl.
+ * 
+ * @author Lionel Seinturier <Lionel.Seinturier@xxxxxxx>
+ */
+public interface LoggerControllerItf
+    extends
+        LoggerController,
+        LoggerControllerRegister {
+
+    final public static String NAME = "logger-controller";
+    
+    final public static InterfaceType TYPE =
+      new InterfaceTypeImpl(
+              NAME,
+              LoggerControllerItf.class.getName(),
+              false, false, false);
+
+}
Index: web/html/tutorials/aokell/examples/LoggerControllerProcessor.java
diff -u /dev/null 
web/html/tutorials/aokell/examples/LoggerControllerProcessor.java:1.1
--- /dev/null   Thu Mar 30 11:33:08 2006
+++ web/html/tutorials/aokell/examples/LoggerControllerProcessor.java   Thu 
Mar 30 11:33:06 2006
@@ -0,0 +1,53 @@
+/***
+ * AOKell
+ * Copyright (C) 2006 INRIA, France Telecom
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+ *
+ * Contact: Lionel.Seinturier@xxxxxxx
+ *
+ * Author: Lionel Seinturier
+ */
+
+package org.objectweb.fractal.aokell.glue;
+
+
+import org.objectweb.fractal.aokell.lib.membrane.marker.NameType;
+
+import spoon.processing.AbstractProcessor;
+import spoon.reflect.declaration.CtClass;
+import spoon.template.Substitution;
+import spoon.template.Template;
+
+/**
+ * This processor introduces the features provided by the name controller.
+ * These features are introduced for all classes that implement the NameType
+ * marker interface.
+ * 
+ * @author Lionel Seinturier <Lionel.Seinturier@xxxxxxx>
+ */
+public class LoggerControllerProcessor extends AbstractProcessor<CtClass> {
+
+    public boolean isToBeProcessed(CtClass ct) {
+        return SpoonHelper.impls(ct,DreamLogType.class);
+    }
+
+    public void process(CtClass ct) {
+        Template t = new LoggerControllerTemplate();
+        Substitution.insertAll(ct,t);
+    }
+    
+}
+
Index: web/html/tutorials/aokell/examples/LoggerControllerTemplate.java
diff -u /dev/null 
web/html/tutorials/aokell/examples/LoggerControllerTemplate.java:1.1
--- /dev/null   Thu Mar 30 11:33:08 2006
+++ web/html/tutorials/aokell/examples/LoggerControllerTemplate.java    Thu 
Mar 30 11:33:06 2006
@@ -0,0 +1,99 @@
+/***
+ * AOKell
+ * Copyright (C) 2006 INRIA, France Telecom
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+ *
+ * Contact: Lionel.Seinturier@xxxxxxx
+ *
+ * Author: Lionel Seinturier
+ */
+
+package org.objectweb.fractal.aokell.glue;
+
+import org.objectweb.fractal.aokell.lib.util.FractalHelper;
+import org.objectweb.fractal.api.Component;
+import aokell.dream.lib.control.logger.LoggerControllerItf;
+
+import spoon.template.Local;
+import spoon.template.Template;
+
+/**
+ * This template defines the elements which are introduced in all classes
+ * which are processed by LoggerControllerProcessor.
+ * 
+ * @author Lionel Seinturier <Lionel.Seinturier@xxxxxxx>
+ */
+public class LoggerControllerTemplate implements Template, 
LoggerControllerItf {
+    
+    @Local
+    public LoggerControllerTemplate() {}
+    
+    @Local
+    private Component getFcComponent() {
+        return null;
+    }
+    
+    // -----------------------------------------------------------
+    // LoggerController interface implementation
+    // -----------------------------------------------------------
+    
+    public void setBaseName(String name) {
+        LoggerControllerItf _loggerc = (LoggerControllerItf)
+                       
FractalHelper.getFcInterface(getFcComponent(),"logger-controller");
+        _loggerc.setBaseName(name);
+    }
+
+    public String getBaseName() {
+        LoggerControllerItf _loggerc = (LoggerControllerItf)
+                       
FractalHelper.getFcInterface(getFcComponent(),"logger-controller");
+        return _loggerc.getBaseName();
+    }
+
+    public int getLoggerLevel(String loggerName) {
+        LoggerControllerItf _loggerc = (LoggerControllerItf)
+                       
FractalHelper.getFcInterface(getFcComponent(),"logger-controller");
+        return _loggerc.getLoggerLevel(loggerName);
+    }
+
+    public void setLoggerLevel(String loggerName, int level) {
+        LoggerControllerItf _loggerc = (LoggerControllerItf)
+                       
FractalHelper.getFcInterface(getFcComponent(),"logger-controller");
+        _loggerc.setLoggerLevel(loggerName,level);
+    }
+
+    public String[] getLoggerNames() {
+        LoggerControllerItf _loggerc = (LoggerControllerItf)
+                       
FractalHelper.getFcInterface(getFcComponent(),"logger-controller");
+        return _loggerc.getLoggerNames();
+    }
+    
+    // -----------------------------------------------------------
+    // LoggerControllerRegister interface implementation
+    // -----------------------------------------------------------
+    
+    public void register(String loggerName, Loggable loggable) {
+        LoggerControllerItf _loggerc = (LoggerControllerItf)
+                       
FractalHelper.getFcInterface(getFcComponent(),"logger-controller");
+        _loggerc.register(loggerName,loggable);
+    }
+
+    public void unregiser(String loggerName, Loggable loggable) {
+        LoggerControllerItf _loggerc = (LoggerControllerItf)
+                       
FractalHelper.getFcInterface(getFcComponent(),"logger-controller");
+        _loggerc.unregiser(loggerName,loggable);
+    }
+
+}
Index: web/html/tutorials/aokell/examples/LoggerControllerType.fractal
diff -u /dev/null 
web/html/tutorials/aokell/examples/LoggerControllerType.fractal:1.1
--- /dev/null   Thu Mar 30 11:33:08 2006
+++ web/html/tutorials/aokell/examples/LoggerControllerType.fractal     Thu 
Mar 30 11:33:06 2006
@@ -0,0 +1,33 @@
+<?xml version="1.0" encoding="ISO-8859-1" ?>
+<!DOCTYPE definition PUBLIC "-//objectweb.org//DTD Fractal ADL 2.0//EN" 
"classpath://org/objectweb/fractal/adl/xml/standard.dtd">
+
+<!--
+ * AOKell
+ * Copyright (C) 2005 INRIA, France Telecom
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+ *
+ * Contact: Lionel.Seinturier@xxxxxxx
+ *
+ * Author: Lionel Seinturier
+ -->
+
+<definition 
name="org.objectweb.fractal.aokell.dream.lib.control.logger.LoggerControllerType">
+       <interface
+               name="//logger-controller"
+               
signature="org.objectweb.fractal.aokell.dream.lib.control.Logger.LoggerControllerItf"
+               role="server"
+       />
+</definition>
Index: web/html/tutorials/aokell/examples/Primitive.fractal
diff -u /dev/null web/html/tutorials/aokell/examples/Primitive.fractal:1.1
--- /dev/null   Thu Mar 30 11:33:08 2006
+++ web/html/tutorials/aokell/examples/Primitive.fractal        Thu Mar 30 
11:33:06 2006
@@ -0,0 +1,68 @@
+<?xml version="1.0" encoding="ISO-8859-1" ?>
+<!DOCTYPE definition PUBLIC "-//objectweb.org//DTD Fractal ADL 2.0//EN" 
"classpath://org/objectweb/fractal/adl/xml/standard.dtd">
+
+<!--
+ * AOKell
+ * Copyright (C) 2005 INRIA, France Telecom
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+ *
+ * Contact: Lionel.Seinturier@xxxxxxx
+ *
+ * Author: Lionel Seinturier
+ -->
+
+<definition
+       name="org.objectweb.fractal.aokell.lib.membrane.primitive.Primitive"
+       
extends="org.objectweb.fractal.aokell.lib.control.logger.LoggerControllerType,org.objectweb.fractal.aokell.lib.control.lifecycle.LifeCycleControllerType,org.objectweb.fractal.aokell.lib.control.binding.BindingControllerType,org.objectweb.fractal.aokell.lib.control.component.ComponentControllerType,org.objectweb.fractal.aokell.lib.control.name.NameControllerType,org.objectweb.fractal.aokell.lib.control.superc.SuperControllerType,org.objectweb.fractal.aokell.lib.control.membrane.MembraneControllerType"
 >
+  
+       <component name="LogC"
+               
definition="org.objectweb.fractal.aokell.lib.control.logger.LoggerController" 
/>
+  
+       <component name="Comp"
+               
definition="org.objectweb.fractal.aokell.lib.control.component.NonCompositeComponentController"
 />
+  
+       <component name="NC"
+               
definition="org.objectweb.fractal.aokell.lib.control.name.NameController" />
+  
+       <component name="LC"
+               
definition="org.objectweb.fractal.aokell.lib.control.lifecycle.NonCompositeLifeCycleController"
 />
+  
+       <component name="BC"
+               
definition="org.objectweb.fractal.aokell.lib.control.binding.PrimitiveBindingController"
 />
+       
+       <component name="SC"
+               
definition="org.objectweb.fractal.aokell.lib.control.superc.SuperController" 
/>
+       
+       <component name="MC"
+               
definition="org.objectweb.fractal.aokell.lib.control.membrane.MembraneController"
 />
+  
+       <binding client="this.//component" server="Comp.//component" />
+       <binding client="this.//name-controller" 
server="NC.//name-controller" />
+       <binding client="this.//lifecycle-controller" 
server="LC.//lifecycle-controller" />
+       <binding client="this.//binding-controller" 
server="BC.//binding-controller" />
+       <binding client="this.//super-controller" 
server="SC.//super-controller" />
+       <binding client="this.///membrane-controller" 
server="MC.///membrane-controller" />
+               
+       <binding client="Comp.//binding-controller" 
server="BC.//binding-controller" />
+       <binding client="BC.//component" server="Comp.//component" />
+       <binding client="BC.//super-controller" 
server="SC.//super-controller" />
+       <binding client="BC.//name-controller" server="NC.//name-controller" 
/>
+       <binding client="LC.//binding-controller" 
server="BC.//binding-controller" />
+       <binding client="LC.//component" server="Comp.//component" />
+
+       <controller desc="mComposite" />
+
+</definition>
Index: web/html/tutorials/aokell/examples/tutorial.zip
<<Binary file>>
Index: web/html/tutorials/aokell/figures/bootstrapComponent.jpg
<<Binary file>>
Index: web/html/tutorials/aokell/figures/componentStructure.jpg
<<Binary file>>
Index: web/html/tutorials/aokell/figures/componentizedMembranes.jpg
<<Binary file>>
Index: web/html/tutorials/aokell/figures/controlLayers.jpg
<<Binary file>>
Index: web/html/tutorials/aokell/figures/flatMembrane.jpg
<<Binary file>>
Index: web/html/tutorials/aokell/figures/markerTypeSystem.jpg
<<Binary file>>
Index: web/html/tutorials/aokell/figures/packages.jpg
<<Binary file>>
Index: web/html/tutorials/aokell/figures/twoLevels.jpg
<<Binary file>>
Index: web/html/tutorials/aokell/overview.html
diff -u /dev/null web/html/tutorials/aokell/overview.html:1.1
--- /dev/null   Thu Mar 30 11:33:09 2006
+++ web/html/tutorials/aokell/overview.html     Thu Mar 30 11:33:07 2006
@@ -0,0 +1,1311 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" 
"http://www.w3.org/TR/html4/loose.dtd";>
+<!--NewPage-->
+<HTML>
+<HEAD>
+<!-- Generated by javadoc (build 1.5.0) on Thu Mar 30 11:15:51 CEST 2006 -->
+<TITLE>
+Overview (AOKell 2.0 Documentation)
+</TITLE>
+
+<META NAME="keywords" CONTENT="Overview, AOKell 2.0 Documentation">
+
+<LINK REL ="stylesheet" TYPE="text/css" HREF="stylesheet.css" TITLE="Style">
+
+<SCRIPT type="text/javascript">
+function windowTitle()
+{
+    parent.document.title="Overview (AOKell 2.0 Documentation)";
+}
+</SCRIPT>
+<NOSCRIPT>
+</NOSCRIPT>
+
+</HEAD>
+
+<BODY BGCOLOR="white" onload="windowTitle();">
+
+
+<!-- ========= START OF TOP NAVBAR ======= -->
+<A NAME="navbar_top"><!-- --></A>
+<A HREF="#skip-navbar_top" title="Skip navigation links"></A>
+<A NAME="skip-navbar_top"></A>
+<!-- ========= END OF TOP NAVBAR ========= -->
+
+<CENTER>
+<H1>
+AOKell 2.0 Documentation</H1>
+</CENTER>
+
+<P align="center">
+<A NAME="overview_description"><!-- --></A>&nbsp;AOKell: an Aspect-Oriented 
Implementation of the Fractal 
+Specifications<p align="center"><a 
href="mailto:Lionel.Seinturier@xxxxxxx";>Lionel Seinturier</a> 
+-
+<a href="mailto:Nicolas.Pessemier@xxxxxxx";>Nicolas Pessemier</a> -
+<a href="mailto:thierry.coupaye@xxxxxxxxxxxxxxxxx";>Thierry Coupaye</a><br>
+02/08/06</p>
+
+<p>This documentation is based on the version of AOKell which can be found 
in 
+the <a href="http://forge.objectweb.org/cvs/?group_id=22";>CVS 
repository</a>.</p>
+
+<h2>Table of Contents</h2>
+<ol>
+  <li>
+<a href="#introduction">Introduction</a></li>
+  <li><a href="#membraneTypes">Membrane Types</a></li>
+  <li><a href="#structure">Structure of a Component</a></li>
+  <li><a href="#features">Features</a></li>
+  <li>
+<a href="#codeStructure">Code Structure</a></li>
+  <li>
+<a href="#testsAndApplications">Tests and Applications</a></li>
+  <li>
+<a href="#performances">Performances</a></li>
+  <li>
+<a href="#writing">Writing new Control Membranes</a></li>
+  <li>
+<a href="#conclusion">Conclusion</a></li>
+</ol>
+
+<p>AOKell is INRIA &amp; France Telecom's implementation of the 
+<a href="http://fractal.objectweb.org/specification/index.html";>Fractal 
Specification</a> <a href="#bibFractal">[1]</a>. This 
+document describes the design choices made to implement AOKell and the 
overall 
+organization of the framework. This document is intended for framework 
+developers that want to extend AOKell, but it can also be useful for 
component 
+developers 
+who want to 
+understand how AOKell works.</p>
+
+<h2><a name="introduction"></a>1 Introduction</h2>
+
+<p>AOKell is a framework for implementing component controllers and 
membranes. As with Julia, the main design goal of AOKell is to implement a 
framework to program component
+controllers: we want to implement an extensible set of control objects, from
+which the user can freely choose and assemble the controller objects he or 
she
+wants, in order to build the membrane of a Fractal component.</p>
+
+<p>Compared to other implementations of the Fractal model, the first 
originality 
+of AOKell is to provide a component-based approach for implementing 
controllers. 
+The control membrane of a component is an assembly of control components. 
The 
+notions of a client interface, a server interface, a binding, a composite 
+component are used at the control level much like they are used at the 
business 
+level. AOKell is then a reflective model in which the notion of a component 
is 
+used to engineer both the control level and the application level.</p>
+
+<p>The second originality of AOKell is to use notions from the domain of 
+aspect-oriented programming for gluing the application and the control 
levels. 
+Each control component is associated with an aspect which monitors the 
execution 
+of the application component and which delegates to the control component 
the 
+realization of control functionalities. This approach fosters modularity by 
+decoupling the implementation of the control from the integration of this 
+control in applications. Currently, two alternative implementations of the 
glue 
+layer are available in the AOKell distribution. The first one relies on
+<a href="http://spoon.gforge.inria.fr";>Spoon</a> <a href="#bibSpoon">[3]</a> 
which is a fast open-compiler 
+for transforming Java code. The second one relies on the 
+aspect-oriented programming language <a 
href="http://www.eclipse.org/aspectj";>AspectJ</a> 
+<a href="#bibSpoon">
+[2]</a>. By default, the Spoon version is used as this is one which provides 
the 
+best performances, both in term of compilation time and in term of execution 
of 
+the compiled code.</p>
+
+<h2><a name="membraneTypes"></a>2 Membrane Types</h2>
+
+<p>AOKell is a level 3.3 implementation of the
+<a href="http://fractal.objectweb.org/specification/index.html";>Fractal 
Specification</a> 
+(see the specifications for the meaning of compliance levels):</p>
+
+<ul>
+  <li>All components implement the
+  <a 
href="http://fractal.objectweb.org/current/doc/javadoc/fractal/org/objectweb/fractal/api/Component.html";>
+  Component</a> interface.</li>
+  <li>The basic controllers (<a 
href="http://fractal.objectweb.org/current/doc/javadoc/fractal/org/objectweb/fractal/api/control/AttributeController.html";>AttributeController</a>,
+  <a 
href="http://fractal.objectweb.org/current/doc/javadoc/fractal/org/objectweb/fractal/api/control/BindingController.html";>
+  BindingController</a>,
+  <a 
href="http://fractal.objectweb.org/current/doc/javadoc/fractal/org/objectweb/fractal/api/control/ContentController.html";>
+  ContentController</a>,
+  <a 
href="http://fractal.objectweb.org/current/doc/javadoc/fractal/org/objectweb/fractal/api/control/LifeCycleController.html";>
+  LifeCycleController</a>,
+  <a 
href="http://fractal.objectweb.org/current/doc/javadoc/fractal/org/objectweb/fractal/api/control/NameController.html";>
+  NameController</a> and
+  <a 
href="http://fractal.objectweb.org/current/doc/javadoc/fractal/org/objectweb/fractal/api/control/SuperController.html";>
+  SuperController</a>) are available.</li>
+  <li>Templates are supported (template components implements the
+  <a 
href="http://fractal.objectweb.org/current/doc/javadoc/fractal/org/objectweb/fractal/api/factory/Factory.html";>
+  Factory</a> interface).</li>
+  <li>A Bootstrap component implementing the
+  <a 
href="http://fractal.objectweb.org/current/doc/javadoc/fractal/org/objectweb/fractal/api/factory/GenericFactory.html";>
+  GenericFactory</a> and the
+  <a 
href="http://fractal.objectweb.org/current/doc/javadoc/fractal/org/objectweb/fractal/api/type/TypeFactory.html";>
+  TypeFactory</a> interface is provided.</li>
+</ul>
+
+<p>A Fractal component is associated to a membrane. The membrane provides a 
+level of control and supervision on the component. Membranes can be 
decomposed 
+into smaller units which are called controllers. A controller implements a 
+particular functionality such as controlling the component bindings or 
managing 
+the lifecycle of the component.</p>
+
+<p>Several types of a membrane can be constructed depending on how 
controllers 
+are grouped together. Following the Julia membrane type system, we support 
13 
+different types of a membrane. The two most common ones are:</p>
+
+<ul>
+  <li><b>primitive</b>: provides the binding, lifecycle, naming controllers 
and the super controllers.</li>
+  <li><b>composite</b>: provides the same controllers as the ones provided 
by 
+  primitive, plus the  content controller.</li>
+</ul>
+
+<p>With AOKell, each type of a membrane is associated to a marker interface. 
The 
+membrane interfaces are defined in a hierarchy. Figure 1 
+sums up the part of the hierarchy which corresponds to the two 
aforementioned 
+types. The controller interfaces provided by each type are also mentioned. 
Notice 
+that a root interface, BaseType, is defined. This interface provides the 
Component 
+controller and is thus implemented by all components.</p>
+
+<p align="center">
+<img src="../figures/markerTypeSystem.jpg" alt="Membrane types" width="561" 
height="197" /></p>
+<p align="center"><b>Fig 1: Membrane types.</b></p>
+
+<p>The interfaces FlatType, PrimitiveType and CompositeType are used to 
+type components. For example, a primitive component implements the 
PrimitiveType interface, 
+which itself implements the SuperController interface, and by extension all 
the 
+interfaces (BindingController, 
+LifeCycleController, etc.) implemented by super-interfaces.  </p>
+
+<p>The use of the membrane types hierarchy presented in figure 1 is a design 
+choice which is specific to the current version of AOKell. This hierarchy 
has 
+been set up to factorize definitions, and to reuse as much code as possible. 
+However, the use of this hierarchy for implementing membranes and 
controllers is 
+not mandatory. The glue layer uses this type hierarchy but nothing prevent 
+the programmer from implementing membranes and controllers without using 
it.</p>
+
+<p>The hierarchy presented in figure 1 is completed with marker interfaces 
for 
+parametric and template components.</p>
+
+
+<h2><a name="structure"></a>3 Structure of a Component</h2>
+
+
+<p>A Fractal component is composed of a <b>content</b> and is associated to 
a 
+membrane. The content is 
+put under the control and the supervision of the membrane. A membrane can be 
+decomposed into smaller units which are called controllers.</p>
+
+
+<p>The purpose of this section is to present the structure set up by AOKell 
for 
+a Fractal component. Two structures exist:. the AO-structure and the 
JL-structure. 
+AO stands for aspect-oriented and JL for Julia-like. They are presented 
+respectively in Sections 3.1 and 3.2.</p>
+
+
+<h3>3.1 AO-Structure</h3>
+
+
+<p>With AOKell, controllers are programmed as  aspects (the orange 
+circles on Figure 2) which inject code into the content class and control 
its 
+behavior. The logic of the controller is not implemented directly into the 
+aspect but in a delegated instance which is associated to the aspect (the 
+&quot;controller implementations&quot; of Figure 2.)</p>
+
+
+<p align="center">
+<img border="0" src="../figures/componentStructure.jpg" width="202" 
height="242"></p>
+
+
+<p align="center"><b>Fig 2: Structure of a component.</b></p>
+
+<p>A Fractal component owns Fractal interfaces. A Fractal interface acts as 
an 
+entry point (server interface) or an exit point (client interface) for the 
+component. A Fractal interface is associated to an
+<a 
href="http://fractal.objectweb.org/current/doc/javadoc/fractal/org/objectweb/fractal/api/type/InterfaceType.html";>
+InterfaceType</a> with a name and a Java interface.</p>
+
+<p align="left">The Fractal interfaces of a component (the green circles on 
+Figure 2) are instances which implement the
+<a 
href="http://fractal.objectweb.org/current/doc/javadoc/fractal/org/objectweb/fractal/api/Interface.html";>
+Interface</a> interface and the Java interface defined in their 
InterfaceType. The type of a Fractal interface is 
+only known at 
+runtime when
+<a 
href="http://fractal.objectweb.org/current/doc/javadoc/fractal/org/objectweb/fractal/api/factory/GenericFactory.html#newFcInstance(org.objectweb.fractal.api.Type,
 java.lang.Object, java.lang.Object)">
+newFcInstance</a> is called to instantiate a component. This approach is 
very dynamic and 
+allows creating interface and component types on the fly. Conversely, this 
late 
+binding mechanism decreases type safety and prevents compile-time checks.</p>
+
+<p>To sum up, the structure of a Fractal component with AOKell is composed 
of:</p>
+
+<ul>
+  <li>One instance for the content.</li>
+  <li>One instance per Fractal business interface.</li>
+  <li>One instance per controller.</li>
+</ul>
+
+<p>In addition to that, one needs to mention that, when AspectJ is used, 
there 
+is also one instance per aspect for the whole application.</p>
+
+<p>This structure could be optimized by merging the controllers with the 
+content. For that, the aspects implementing controllers could directly 
introduce 
+the logic of the controllers into the content class, instead of introducing 
a 
+pattern which delegates this logic to some external instances.</p>
+
+<h4>Evaluation of the AO-Structure</h4>
+
+<p>With this structure, the control features are directly injected into the 
+content by the controllers. This structure is a bit different from the one 
+defined by other implementations of the Fractal Specifications such as 
Julia.</p>
+
+<p>With Julia, the content and the component are by default, two separated 
+instances. The content class is then just a java.lang.Object which is not 
aware 
+of the controllers. Nevertheless, if the content class implements one or 
several 
+control interfaces, then this implementation is notified of any call issued 
on 
+the controllers. For example, if the content class implements the
+<a 
href="http://fractal.objectweb.org/current/doc/javadoc/fractal/org/objectweb/fractal/api/control/BindingController.html";>
+BindingController</a> interface, then whenever two components are bound, the 
bindFc method of the content class will be notified. By implementing the 
control 
+interfaces, the programmer has then the possibility of reacting to control 
+events. Notice that this is not a redefinition of the controllers behavior, 
as, 
+in all cases, the behaviors implemented in the membrane are always 
executed.</p>
+
+<p>The structure implemented by AOKell merges the content and 
+the component, whereas, with Julia, the content and the component are 
+separated.</p>
+
+<p>The advantage of merging the content and the component is that the 
control 
+interfaces are directly accessible at the content level. For example, with 
AOKell, 
+the programmer can write the following content class.</p>
+
+<p><code>public class ClientImpl implements PrimitiveType {<br>
+&nbsp; public ClientImpl() {}<br>
+&nbsp; public void run() {<br>
+&nbsp;&nbsp;&nbsp; Service s = (Service) <b>lookupFc(&quot;s&quot;);</b><br>
+&nbsp;&nbsp;&nbsp; s.message();<br>
+&nbsp; }<br>
+}</code></p>
+
+<p>ClientImpl is controlled by a primitive membrane, and the interfaces of 
all 
+controllers included in this membrane are then visible. The programmer can 
thus 
+call the lookupFc method which is implemented by the binding controller. The 
+programmer does not have to implement the BindingController interface to 
+manipulate bindings as this is the case with Julia. Instead, the programmer 
must 
+tag the content class as a primitive component. This tagging takes the form 
of 
+the implementation of the marker interface PrimitiveType.</p>
+
+<h3>3.2 JL-Structure</h3>
+
+<p>While the structure of a Fractal component with AOKell relieves the 
+programmer from the pain of implementing control interfaces, this structure 
can be problematic for reusing applications 
+already written with Julia. In order to facilitate this, AOKell also 
provides a 
+component structure which is more similar to the one of Julia where:</p>
+
+<ul>
+  <li>The content is free of any injection of control interfaces.</li>
+  <li>If the content class implements control interfaces, the content is 
notified 
+  whenever a call is issued on the controller implementations.</li>
+</ul>
+
+<p>With the JL-structure, the previous class needs to be written as 
follows:</p>
+
+<p><code>public class ClientImpl implements BindingController {<br>
+<br>
+&nbsp; public ClientImpl() {}<br>
+&nbsp; public void run() {<br>
+&nbsp;&nbsp;&nbsp; Service s = (Service) <b>lookupFc(&quot;s&quot;);</b><br>
+&nbsp;&nbsp;&nbsp; s.message();<br>
+&nbsp; }<br>
+<br>
+&nbsp; public String[] listFc() { return new String[]{&quot;s&quot;}; }<br>
+&nbsp; public void bindFc(String itfName, Object target) {<br>
+&nbsp;&nbsp;&nbsp; if( itfName.equals(&quot;s&quot;) ) { s = (Service) 
target; }<br>
+&nbsp; }<br>
+&nbsp; public Object lookupFc(String itfName) {<br>
+&nbsp;&nbsp;&nbsp; if( itfName.equals(&quot;s&quot;) ) { return s; }<br>
+&nbsp;&nbsp;&nbsp; return null;<br>
+&nbsp; }<br>
+&nbsp; public void unbindFc(String itfName) {<br>
+&nbsp;&nbsp;&nbsp; if( itfName.equals(&quot;s&quot;) ) { s = null; }<br>
+&nbsp; }<br>
+&nbsp; private Service s;<br>
+}</code></p>
+
+<h3>3.3 Conclusion on the Structure of a Component</h3>
+
+<p>Two structures of a Fractal component are available with AOKell: AO and 
JL. With 
+the AO-structure, the control interfaces are directly injected into the 
+content, and the programmer can use them directly. The JL-structure is  
similar to the one implemented by Julia, and facilitates the use of 
applications 
+developed initially with Julia.</p>
+
+
+<h2><a name="features"></a>4 Features</h2>
+
+
+<p>In order to promote flexibility, the AOKell framework has been decomposed 
in 
+modules called features. The purpose of this decomposition is 
+to introduce some degrees of variability in the framework and to let 
developers 
+change the implementation of these features. So far, four 
+features exist:</p>
+
+<ul>
+  <li>fcinterface: is concerned with the way Fractal interfaces are 
generated,</li>
+  <li>glue: is concerned with the way the control and the content are glued 
+  together,</li>
+  <li>loggable: is concerned with the ability of having a logger attached to 
+  Fractal components,</li>
+  <li>membrane: is concerned with the way control membranes are 
implemented.</li>
+</ul>
+
+
+<p>Different implementations of these features are provided with AOKell. 
While a 
+default implementation is provided for each feature, the developer can still 
+choose an alternative version or provide her/his own version by configuring 
the 
+properties defined in the build.properties file and recompiling AOKell.</p>
+
+
+<h3>4.1 Feature fcinterface</h3>
+
+
+<p>Fractal components provide and require interfaces. These interfaces are 
+associated with a signature (defined with a Java interface), a cardinality 
+(singleton or collection), a contingency (mandatory or optional) and may be 
+client (required) or server (provided). With AOKell these Fractal interfaces 
are 
+Java classes which implement the
+<a 
href="http://fractal.objectweb.org/current/doc/javadoc/fractal/org/objectweb/fractal/api/Interface.html";>
+Interface</a> interface and the Java interface defined in their signature. 
</p>
+
+
+<p>The fcinterface feature is concerned with the way these classes are 
generated. 
+Two versions of the feature exist:</p>
+
+<ul>
+  <li>rt (default): the class is generated at runtime with the <a 
href="http://asm.objectweb.org";>ASM</a> 
+  bytecode engineering library,</li>
+  <li>ct: the class is pre-compiled with the
+  InterfaceGenerator tool.</li>
+</ul>
+
+
+<p>The default version of this feature is rt. The rt version is more 
dynamic: 
+Fractal interface signatures can be determined at very lately, at run-time, 
just 
+before instantiating the component.</p>
+
+
+<p>With the ct version, all Fractal interfaces are defined at compile-time 
and 
+the developer can not use at run-time an unforeseen interface. This version 
is 
+then less flexible. However, with this version, ASM is not needed. In many 
+cases, this simplifies the merging of AOKell with other existing framework, 
+especially those which themselves, perform bytecode engineering or class 
loading. 
+For example, this version has been used to port
+<a href="http://www-adele.imag.fr/frogi/";>FROGi</a> to AOKell.</p>
+
+
+<h3>4.2 Feature glue</h3>
+
+
+<p>Two dimensions exist when programming Fractal component: the business 
part 
+which deals with the core functionalities provided by the component, and the 
+control part which deals with the way components are managed. </p>
+
+
+<p>The glue feature deals with the way these two parts are glued together. 
Two 
+versions of this feature exists:</p>
+
+
+<ul>
+  <li>spoon (default): the glue is implemented with Spoon processors,</li>
+  <li>aspectj: the glue is implemented with AspectJ aspects.</li>
+</ul>
+
+
+<h3>4.3 Feature loggable</h3>
+
+
+<p>As with Julia, Fractal components may be associated with a
+<a href="http://monolog.objectweb.org";>Monolog</a> logger. When this feature 
is 
+enabled, each primitive component is bound to a logger instance and a 
+monolog-factory instance. These instances can be retrieved by calling the 
+lookupFc method provided by the BindingController interface.</p>
+
+
+<p>The loggable feature is concerned with whether this feature is enabled or 
+not. Two versions of the feature exist:</p>
+
+<ul>
+  <li>off (default): the feature is disabled,</li>
+  <li>on: the feature is enabled.</li>
+</ul>
+
+
+<h3><a name="featureMembrane"></a>4.4 Feature membrane</h3>
+
+
+<p>Control membranes defines the way components are managed.</p>
+
+
+<p>The membrane feature is concerned with the way membranes are implemented. 
Two 
+versions of the feature exist:</p>
+
+<ul>
+  <li>oo (default): controllers are implemented with Java objects and 
control 
+  membranes are lists of controllers,</li>
+  <li>comp: controllers are implemented with component, called control 
+  components, and control membranes are composites which contain control 
+  components and which export control interfaces.</li>
+</ul>
+
+
+<p>The following sub-sections provide more details about the 
componentization of 
+membranes. Notice that, in both cases the implementation code of controllers 
is 
+similar. The difference lies in the way the membrane is constructed: a 
simple 
+list of objects in the first case, and a composite component with 
+sub-components, interfaces and bindings in the second case.</p>
+
+
+<h4>4.4.1 Componentized Membranes</h4>
+
+
+<p>Each membrane is decomposed into a set of controllers. The purpose of 
this 
+decomposition is to separate the various functionalities involved 
(lifecycle, 
+binding, naming, etc.) and to make them more reusable in different types of 
a 
+membrane. However, dependencies exist between controllers which prevent 
their 
+reuse. For example, when considering a flat membrane which provides a 
component, 
+a naming, a binding and a lifecycle controllers, the following dependencies 
can 
+be found:</p>
+
+
+<ul>
+  <li>the lifecycle controller depends on the binding controller: indeed, 
+  mandatory interfaces must be bound before starting a component. Hence, 
before 
+  performing the start operation, the lifecycle controller must query the 
+  binding controller to check if this condition evaluates to true.</li>
+  <li>the lifecycle controller depends on the component controller: for the 
same 
+  reason as before, the lifecycle controller has to retrieve the list of 
+  mandatory interfaces which is a piece of information managed by the 
component 
+  controller.</li>
+  <li>the binding controller depends on the component controller: the listFc 
+  method defined in the binding control interface returns the names of the 
+  client interfaces defined by the current component. This piece of 
information is 
+  stored by the component controller.</li>
+  <li>the component controller depends on the binding controller: indeed, 
when 
+  returning the list of component interfaces, the getFcInterfaces method 
must return 
+  the singleton interfaces and the collection interfaces currently bound. 
This 
+  last piece of information is stored by the binding controller.</li>
+</ul>
+
+
+<p>Several other dependencies can be defined when considering the other 
membrane 
+types such as primitive and composite. Notice that these dependencies 
depends on 
+the semantics chosen for each controller. A different control logic may lead 
to 
+different dependencies.</p>
+
+
+<p>In our opinion, a pure object-oriented approach is not adequate for 
capturing 
+these dependencies. The best solution that could be designed would be to 
declare 
+references and to provide methods for setting and unsetting these 
references. 
+Yet, this solution is not satisfactory as the dependencies are tangled with 
the 
+rest of the code. A better solution is to adopt a component-oriented 
approach 
+and to isolate these dependencies into a software architecture. The solution 
+implemented in AOKell is then to provide a component-oriented approach for 
+implementing membranes:</p>
+
+
+<ul>
+  <li>each control membrane is associated to a composite component which 
exports 
+  the control interfaces provided by this membrane,</li>
+  <li>each controller is programmed as a component and is inserted into the 
+  previously defined composite component,</li>
+  <li>controllers are bound together depending on the relations deduced from 
+  their semantics.</li>
+</ul>
+
+
+<p>Figure 3 illustrates this approach.</p>
+
+
+<p align="center">
+<img border="0" src="../figures/componentizedMembranes.jpg" width="554" 
height="263" /></p>
+<p align="center"><b>Fig 3: Componentized membranes</b>.</p>
+
+
+<p>When designing control membranes as components, the expected benefits are 
the 
+same as the ones expected when designing an application with components: 
+to foster the reuse of components (controllers) and to facilitate the 
evolution 
+of the application (the control logic) by defining explicitly existing 
relations 
+between components.</p>
+
+
+<h4>4.4.2 Fractalization of the Membrane</h4>
+
+
+<p>Once the principle of defining the control membranes with components and 
+bindings has been set up, all the notions and tools defined by Fractal can 
be 
+reused. Among others, the Fractal API and the Fractal ADL are the two best 
+candidates. Hence the architectures of the 13 existing membrane types in 
AOKell 
+have defined with Fractal ADL. Figure 4 illustrates the architecture of the 
flat membrane. 
+The Fractal ADL definition follows.</p>
+
+
+<p align="center">
+<img border="0" src="../figures/flatMembrane.jpg" width="291" height="130" 
/></p>
+<p align="center"><b>Fig 4: Architecture of the flat membrane type.</b></p>
+
+
+<p><code>&lt;!-- o.o.f is a shortcut for org.objectweb.fractal --&gt;<br>
+&lt;definition name=&quot;o.o.f.aokell.lib.membrane.flat.Flat&quot;<br>
+&nbsp;extends=&quot;o.o.f.aokell.lib.control.component.ComponentControllerType,<br>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 
+o.o.f.aokell.lib.control.name.NameControllerType,<br>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 
+o.o.f.aokell.lib.control.lifecycle.LifeCycleControllerType,<br>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 
+o.o.f.aokell.lib.control.binding.BindingControllerType&quot; &gt;&nbsp;  
</code></p>
+
+
+<p><code>&nbsp; &lt;component name=&quot;Comp&quot;<br>
+&nbsp;&nbsp;&nbsp;definition=&quot;o.o.f.aokell.lib.control.component.ComponentController&quot;
 
+/&gt;<br>
+<br>
+&nbsp; &lt;component name=&quot;NC&quot;<br>
+&nbsp;&nbsp;&nbsp;definition=&quot;o.o.f.aokell.lib.control.name.NameController&quot;
 /&gt;<br>
+<br>
+&nbsp; &lt;component name=&quot;LC&quot;<br>
+&nbsp;&nbsp;&nbsp;definition=&quot;o.o.f.aokell.lib.control.lifecycle.NonCompositeLifeCycleController&quot;
 /&gt;<br>
+<br>
+&nbsp; &lt;component name=&quot;BC&quot;<br>
+&nbsp;&nbsp;&nbsp;definition=&quot;o.o.f.aokell.lib.control.binding.FlatBindingController&quot;
 
+/&gt;<br>
+<br>
+&nbsp; &lt;binding client=&quot;this.component&quot; 
server=&quot;Comp.component&quot; /&gt;<br>
+&nbsp; &lt;binding client=&quot;this.name-controller&quot; 
server=&quot;NC.name-controller&quot; /&gt;<br>
+&nbsp; &lt;binding client=&quot;this.lifecycle-controller&quot; 
server=&quot;LC.lifecycle-controller&quot; /&gt;<br>
+&nbsp; &lt;binding client=&quot;this.binding-controller&quot; 
server=&quot;BC.binding-controller&quot; /&gt;<br>
+<br>
+&nbsp; &lt;binding client=&quot;Comp.binding-controller&quot; 
server=&quot;BC.binding-controller&quot; /&gt;<br>
+&nbsp; &lt;binding client=&quot;BC.component&quot; 
server=&quot;Comp.component&quot; /&gt;<br>
+&nbsp; &lt;binding client=&quot;LC.binding-controller&quot; 
server=&quot;BC.binding-controller&quot; /&gt;<br>
+&nbsp; &lt;binding client=&quot;LC.component&quot; 
server=&quot;Comp.component&quot; 
+/&gt;<br>
+<br>
+&nbsp; &lt;controller desc=&quot;mComposite&quot; /&gt;<br>
+&lt;/definition&gt;</code></p>
+
+
+<p>The previous ADL piece of code defines 4 components (controllers) and 8 
+bindings. 4 of them are export bindings and the next 4 are normal bindings 
+between components. In addition, the Flat component is of type mComposite. 
mComposite (resp. mPrimitive) is a new controller description which is 
+defined by AOKell for designating composite (resp. primitive) components 
which 
+implement a control function.</p>
+
+
+<p>We won't go into the details of the other 12 membranes. Their definitions 
can 
+be find in the AOKell source code (see package
+org.objectweb.fractal.aokell.lib.membrane). The philosophy of control 
+membranes with AOKell is summarized in Figure 5.</p>
+
+
+<p align="center">
+<img border="0" src="../figures/twoLevels.jpg" /></p>
+<p align="center"><b>Fig 5: Componentized membranes revisited.</b></p>
+
+
+<h4>4.4.3 Membrane Factory</h4>
+
+
+<p>When instantiating a component, the component factory needs to create a 
+membrane (composite component), create the content, and then, link the 
content 
+to the membrane. A factory is provided by AOKell to create membranes. This 
+factory is implemented as an interface (membrane-factory) provided by the 
bootstrap component. 
+The Java definition of this interface follows.</p>
+
+<p align="center">
+<img border="0" src="../figures/bootstrapComponent.jpg" width="261" 
height="63" /></p>
+<p align="center"><b>Fig 6: AOKell bootstrap component.</b></p>
+
+
+<p><code>import org.objectweb.fractal.api.Component;<br>
+import org.objectweb.fractal.api.factory.InstantiationException;<br>
+<br>
+public interface MembraneFactory {<br>
+<br>
+&nbsp;/**<br>
+&nbsp; * Return the membrane associated with the given controller 
description.<br>
+&nbsp; */<br>
+&nbsp;public Component newFcMembrane( Object controllerDesc )<br>
+&nbsp;throws InstantiationException;<br>
+<br>
+}</code></p>
+
+
+<p>The implementation of the membrane factory relies on the generic 
component 
+factory. Indeed, few differences exist between business component and 
control 
+components. They both provide and require interfaces, they are bound with 
other 
+components, and their architecture is defined with Fractal ADL.</p>
+
+
+<p>In order to save execution time, the ADL definition of the membranes is 
+compiled into Java code with the static backend provided by Fractal ADL. 
Indeed, 
+parsing the ADL definition of the membrane for each newly created business 
+component is costly whenever numerous business components, and then 
+componentized membranes for these components, need to be 
+created. By parsing and compiling membrane definitions once, we save a 
+significant amount of execution time.</p>
+
+
+<h4><a name="controllingControllers"></a>4.4.4 Controlling the 
Controllers</h4>
+
+
+<p>The rationale for defining control membranes and controllers with 
components 
+and bindings is to provide a powerful mean to engineer the control dimension 
of 
+the component model. The idea is that different applications will have 
different 
+needs in terms of control. The functionalities needed to control embedded 
+real-time components is certainly not the same as the one required by 
components 
+for information systems. Yet, few component models tackle the issue of 
engineering 
+the control dimension. AOKell addresses this issue by providing the same 
notions 
+(components and bindings) for engineering the control dimension and the 
business 
+dimension. The glue between these two dimensions is provided by Spoon 
processors 
+or AspectJ aspects. By 
+offering developers powerful means to program control 
+membranes, we hope to promote adaptability and to ensure that applications 
will 
+be better integrated within various different execution contexts.</p>
+
+
+<p>However, as controllers are programmed as components, the issue of the 
+control functions applied to controllers can be raised. This leads to a 
three-level 
+model where M0  is the business level, M1 is the level controlling M0 and 
+M2  is the level controlling M1 (see Figure 7).</p>
+
+
+<p align="center">
+<img border="0" src="../figures/controlLayers.jpg" width="193" height="86" 
/></p>
+<p align="center"><b>Fig 7: Control layers.</b></p>
+
+
+<p>As the layering of control functions can not be infinite, we have to 
provide 
+a way to stop  the recursion. Basically, two solutions can be designed:</p>
+<ul>
+  <li>either M2 is implemented with M1: in such a case, a control membrane 
(at 
+  the M1 level) controls other M1 membranes and provides also the control 
+  function for itself,</li>
+  <li>or M2 is implemented as an ad-hoc policy in M1 (hence M2 does not 
exists 
+  per se).</li>
+</ul>
+<p>The second solution has been implemented with AOKell. The rationale for 
this 
+choice is that, although we need to adapt the control policy to several 
+application domains and execution contexts, the control of controllers is an 
+application domain per se, and is unlikely to be subject to tremendous 
chances 
+over time. Hence, although less flexible, the ad-hoc solution chosen for 
level 
+M2 is also certainly more efficient than a fully open and reflective 
solution.</p>
+
+
+<h3>4.5 Conclusion on Features</h3>
+
+
+<p>The feature mechanism provide some degrees of variability and allow the 
+developers to customize the behavior of AOKell. The default feature 
+configuration is: fcinterface rt, glue aspectj, loggable off, membrane 
component. By 
+configuring the properties defined in the build.properties file and 
recompiling 
+AOKell, the developer can choose his/her own version.</p>
+
+
+<h2><a name="codeStructure"></a>5 Code Structure</h2>
+
+<p>The source code of AOKell is organized in four modules:</p>
+<ul>
+  <li><b>aokell-glue</b>: this module contains the glue (Spoon processors or 
+  AspectJ aspects) for integrating control membranes with the application 
level.</li>
+
+  <li><b>aokell-component</b>: this module contains  the Bootstrap 
component.</li>
+
+  <li><b>aokell-lib</b>: this module contains controllers and membranes 
+  implementations.</li>
+
+  <li><b>aokell-tools</b>: this module contains some utility tools. These 
+  are compile-time tools are not needed at run-time.</li>
+</ul>
+
+<p>All the glue code is packaged in aokell-glue.jar. Two verfsions of this 
file 
+exist depending on whether the glue feature is set to spoon or to aspectj. 
The 
+file are named respectively aokell-glue-spoon.jar and 
aokell-glue-aspectj.jar. The other modules only 
+contain classes and interfaces. These modules can not be used independently: 
aokell-glue, aokell-component 
+and aokell-tools use classes and interfaces defined in aokell-lib. The 
components in aokell-component are 
+modified by the glue code contained in aokell-glue.</p>
+<p align="center">
+<img src="../figures/packages.jpg" alt="Package dependencies" width="370" 
height="183" /></p>
+<p align="center"><b>Fig 8: Package dependencies.</b></p>
+
+<p>AOKell jar size occupation is 100KB (compared to 180KB for Julia 
+2.2): 16KB for aokell-glue-spoon.jar, 2KB for aokell-component.jar and 82KB 
for aokell-lib.jar.</p>
+
+<h2><a name="testsAndApplications"></a>6 Tests and applications</h2>
+
+<p>This section reports on the tests and the applications which are 
available 
+with AOKell.</p>
+
+<h3>6.1 Compliance Tests</h3>
+
+<p>Julia is distributed with a set of 142 <a 
href="http://www.junit.org";>JUnit</a> compliance tests. On the 142 
+tests, 138 run successfully with AOKell. This section comments on the 6 
tests where the behavior of AOKell differs from that of Julia.</p>
+
+<p>The test testParametricPrimitiveTemplate in TestComponent reports an 
error, 
+because the setter method for the attribute X11 is named setWriteOnlyX11. As 
+specified in the Fractal Specifications, AOKell expects a setter method 
named 
+setX11. In our opinion, the problem lies with the test, not with AOKell.</p>
+
+<p>The test testStarted in TestLifeCycleController assumes that a method 
call on 
+a stopped interface hangs. This is not an issue related with the Fractal 
+Specifications but with the semantics chosen by Julia for lifecycle 
controllers. AOKell chooses instead to throw an exception. This test is then 
not a Fractal 
+test, but a Julia specific one.</p>
+
+<p>The test testWouldCreateNonLocalImportBinding in TestContentController 
fails. 
+It seems that the test tries to bind a mandatory interface to an optional 
one.&nbsp; 
+This is not permitted with AOKell.</p>
+
+<p>The test testRemoveNotStopped in TestLifeCycleController fails because 
AOKell 
+does not automatically starts components when they are added in a composite, 
+which is what is assume by the test. As far as we understand the Fractal 
+Specifications, this is a Julia specific behavior.</p>
+
+<h3>6.2 Sample Applications</h3>
+
+<p>The following applications are known to run with AOKell:</p>
+
+<ul>
+  <li>comanche: a Web server.</li>
+  <li>Fractal RMI: the extension of Fractal for dealing with remote 
components.</li>
+  <li><a 
href="http://www.lifl.fr/~moroy/fractalexplorer/fractal_explorer.html";>
+  Fractal Explorer</a>: a run-time graphical console for Fractal 
applications.</li>
+  <li><a href="http://gotm.objectweb.org/";>GoTM</a>: a framework for 
building 
+  transaction services.</li>
+  <li><a href="http://www-adele.imag.fr/frogi/";>FROGi</a>: a framework for 
+  packaging Fractal components in OSGi bundles.</li>
+  <li>various &quot;Hello world&quot; examples to illustrate the use of 
Fractal ADL, 
+  templates, collection interfaces, etc.</li>
+</ul>
+
+<p>Some controllers, originally developed with Julia, have also been 
+successfully implemented with AOKell:</p>
+
+<ul>
+  <li><a href="http://dream.objectweb.org/";>Dream</a>: a framework for the 
+  construction of communication middleware containing a set of dedicated 
+  controllers.</li>
+  <li>Fractal pool: a controller for managing caches.</li>
+</ul>
+
+<p>This initial list of applications and controllers running with AOKell is 
+permanently under construction and we welcome any proposal for extending 
it.</p>
+
+<h2><a name="performances"></a>7 Performances</h2>
+
+<p>In this section, we compare the performances of AOKell with those of 
Julia on 
+a test suite known as JACBenchmark, and the performance tests of 
+Julia.</p>
+
+<p>The purpose of our benchmark is to evaluate the overhead of running a 
&quot;Fractalized&quot; application with AOKell. The purpose is not to 
evaluate the time 
+needed to compile an AOKell application, nor to evaluate the time taken by 
+control operations (such as starting or stopping a component). The times we 
are 
+measuring are the ones experienced by an end user who is running an 
&quot;AOKellized&quot; 
+application.</p>
+
+<p>JACBenchmark is a benchmark which we have developed for AOP applications. 
+The benchmark has been adapted to support Fractal components. The benchmark 
+contains a composite and two primitive components: a client and a server. 
The 
+server component implements an interface with 8 different methods. Each 
method 
+implements a different signature. The methods are not empty, but do not 
perform 
+any interesting stuff (empty methods could distort the benchmark). A warm-up 
+procedure is executed before taking any measures to avoid side-effects 
introduced 
+by the JVM.</p>
+
+<p>The client component issues one million calls on each method of the 
server 
+interface (total: 8 million calls). The procedure is repeated 4 times. The 
+result of the benchmark is the mean time of the 4 measures. The measures are 
+taken on a 1.5GHz PC running Windows XP Pro and Sun JDK 1.5.0.</p>
+
+<p>Table 1 compares the results of the current version of AOKell (2.0) to 
those of Julia 
+2.1.1. The performances of 
+AOKell with two different configurations, glue feature implemented with 
AspectJ 
+or Spoon, are measured. The 
+performances of two Julia optimization levels, NONE and MERGEALL, are also 
+measured. The optimization level of Julia 
+known as MERGEALL consists in merging the content, the controller and the 
+interceptors. We also measure the cost of the interception performed by 
+the frameworks.</p>
+
+<table>
+<tr>
+<td valign="top">
+
+<table border="1">
+<tr><td colspan="2" rowspan="2"><b>Implementation</b></td>
+  <td colspan="2" align="center">
+  <p align="center"><b>Time (in ms)</b></td></tr>
+<tr><td align="center">lifecycle</td><td align="center">no 
lifecycle</td></tr>
+<tr><td rowspan="2">AOKell 2.0</td><td>AspectJ</td><td 
align="center">443</td>
+  <td align="center">212</td></tr>
+<tr><td>Spoon</td><td align="center"><b>221</b></td><td 
align="center">212</td></tr>
+<tr><td rowspan="2">Julia 2.1.1</td><td>NONE</td><td align="center">484</td>
+  <td align="center">234</td></tr>
+<tr><td>MERGEALL</td><td align="center">396</td><td 
align="center">234</td></tr>
+</table>
+
+</td>
+
+<td> &nbsp; </td>
+
+<td valign="top">
+
+<table border="1">
+<tr><td rowspan="2"><b>Implementation</b></td>
+  <td colspan="2" align="center">
+  <p align="center"><b>Time (in ms)</b></td></tr>
+<tr><td align="center">interception</td><td align="center">no 
interception</td></tr>
+<tr><td>Pure Java 1.5.0</td><td align="center"><b>172</b></td>
+  <td align="center">122</td></tr>
+<tr><td>AspectJ 1.2.1</td><td align="center">206</td>
+  <td align="center">&nbsp;</td></tr>
+<tr><td>JBoss AOP 1.1.1</td><td align="center">1046</td>
+  <td align="center">&nbsp;</td></tr>
+</table>
+
+
+</td>
+</tr>
+</table>
+
+
+<p><b>Tab 1: Cost of invoking and executing an operation (x 
8,000,000).</b></p>
+
+<p>The left part of Table 1 compares the figures obtained with AOKell with 
those 
+obtained with Julia. Two series of figures are given: with the lifecycle 
+activated or not. Let remind that this controller performs some interception 
on 
+incoming calls to implement the lifecycle policy.</p>
+
+<p>A difference between AOKell and Julia can be witnessed when the lifecycle 
is 
+activated. The main reason for this difference lies in the semantics 
implemented 
+by the lifecycle controller. With AOKell, this controller rejects calls on 
+stopped components. With Julia, the lifecycle controller blocks calls on 
stopped 
+components and counts the number of executing methods (to avoid removing a 
+component which is still executing some requests.) This semantics implies 
some 
+additional treatments, among others the management of shared data which 
needs to 
+be synchronized. The cost of these treatments leads to the difference 
witnessed 
+in Table 1.</p>
+
+<p>Another difference which is worth mentioning concerns the figures for 
AOKell with Spoon and AOKell with AspectJ. The results  show that  Spoon 
performs better than  AspectJ when 
+the lifecycle control comes into play. The reason is that Spoon, being 
+a general purpose transformation tool, allows optimizing more aggressively 
than 
+AspectJ, the transformed code. For example, the interception code can be 
+inserted directly into the intercepted methods. By contrast, AspectJ inserts 
a 
+call to the interception code. This indirection leads to a additional method 
+call for every component operation invocation, and thus, multiply by 2 the 
cost 
+of invoking an operation.</p>
+
+<p>Notice that the performance of AOKell are the same whatever the chosen 
+values are for the features loggable, membrane and fcinterface. Indeed, 
these 
+features only impact the execution time of control functions, not the 
+execution time of business methods. Hence, it is worth noticing that there 
is no 
+cost, in terms of business method execution, in using componentized 
membranes 
+compared to using membranes with plain old Java objects.</p>
+
+<p>As a matter of comparison, the right part Table 1 gives the execution 
time of the same 
+benchmark in pure Java (no Fractal components), in AspectJ 1.2.1 and in 
JBoss 
+AOP 1.1.1. For the first case, a proxy instance is inserted in front of the 
+server objects to evaluate the interception cost. For the last two cases, 
+AspectJ and JBoss AOP, an empty around advice is woven on 
+the server object. Compared to the Java version, the AOKellization with 
Spoon 
+introduces an overhead of 28% (221ms vs. 172ms), which is in our opinion 
+bearable given the benefits brought by the component orientation of Fractal 
and 
+AOKell.</p>
+
+<h2><a name="writing"></a>8 Writing new Control Membranes</h2>
+
+<p>This section provides, step by step, a guide for writing new controllers 
and new control 
+membranes with AOKell. As explained in section <a 
href="#features">Features</a>, 
+two styles of control membranes are supported: object-oriented or 
componentized. 
+The choice of one of these two modes is a compile-time issue which depends 
on 
+the value of the fcinterface feature.</p>
+
+<p>Section 8.1 details the writing of plain old Java controllers. This guide 
is 
+illustrated with an example, a Logger controller, taken from the porting of 
the
+<a href="http://dream.objectweb.org";>Dream</a> framework to AOKell. Section 
8.2 
+revisits this example in the context of componentized membranes.</p>
+
+<p>The whole source code of this tutorial, both for Section 8.1 and Section 
8.2, 
+can be downloaded in a single <a href="../examples/tutorial.zip">zip 
file</a>.</p>
+
+<h3>8.1 POJO controllers</h3>
+
+<p>This section presents the writing of a POJO controller with AOKell.</p>
+
+<p>There is 
+ 
+two ways of writing a POJO controller, depending on whether the controller 
is weakly 
+or tightly coupled with the component. In the former case, the controller is 
+registered with the membrane. This process is presented in Section 8.2.1. 
When a 
+controller needs to be more tightly coupled, some glue code must be 
provided. As 
+explained in the previous sections, this glue code may perform injections 
and 
+interceptions. Section 8.2.2 extends the process of Section 8.2.1 with the 
+details of programming the glue code for controllers tightly coupled with 
the 
+components.</p>
+
+<h4>8.2.1 Simple POJO controllers</h4>
+
+<p>The process of writing a POJO controller goes through the following three 
+steps:</p>
+
+<ol>
+  <li>Determining the control interface</li>
+  <li>Implementing the controller</li>
+  <li>Registering the controller</li>
+</ol>
+
+<h4>Step 1: Determining the control interface</h4>
+
+<p>The control interface is the externally visible entry point for the 
+controller. For the purpose of our example, we define the
+<a href="../examples/LoggerControllerItf.java">LoggerControllerItf</a> 
interface 
+which is the aggregation of two existing Dream interfaces:
+<a 
href="http://dream.objectweb.org/1.0/javadoc/dream-core/org/objectweb/dream/control/logger/LoggerController.html";>
+LoggerController</a> and
+<a 
href="http://dream.objectweb.org/1.0/javadoc/dream-core/org/objectweb/dream/control/logger/LoggerControllerRegister.html";>
+LoggerControllerRegister</a>. Of course, it is not mandatory to write a new 
+interface, and the programmer can reuse any existing Java interface (e.g. 
+java.lang.Runnable), even if its source code is not available (of course, 
the 
+bytecode must be available).</p>
+
+<h4>Step 2: Implementing the controller</h4>
+
+<p>A controller is a class which implements a given interface, such as the 
one 
+previously defined, and the <a 
href="../examples/Controller.java">Controller</a> 
+interface defined by AOKell. This interface defines three methods:</p>
+
+<p><code>interface Controller {<br>
+&nbsp; public void setFcCompCtrl( Component compctrl );<br>
+&nbsp; public void initFcCtrl();<br>
+&nbsp; public void cloneFcCtrl( Component dst, Object hints ) throws 
+CloneCtrlException;<br>
+}</code></p>
+
+<p>The programmer implements these methods but never calls them directly. 
They 
+are called by the AOKell framework. In addition a controller class must 
provided 
+a no-argument constructor. The definition of the methods from the Controller 
+interface follows:</p>
+
+<ul>
+  <li><code>setFcCompCtrl</code>: the given parameter is the reference of the
+  <a 
href="http://fractal.objectweb.org/current/doc/javadoc/fractal/org/objectweb/fractal/api/Component.html";>
+  Component</a> interface associated to the current component. By this way, 
+  every controller in a membrane knows the Component identity and can 
retrieve 
+  any other control interface by invoking getFcInterface().</li>
+  <li><code>initFcCtrl</code>: this method is available for initializing the 
+  controller. This method is invoked by the framework after 
<code>setFcCompCtrl</code>. 
+  The reference to the Component interface is then known and some 
initialization 
+  treatments, depending on this reference, can be performed.</li>
+  <li><code>cloneFcCtrl</code>: this method is invoked by the
+  <a 
href="http://fractal.objectweb.org/current/doc/javadoc/fractal/org/objectweb/fractal/api/factory/Factory.html";>
+  Factory</a> controller to clone the controller state. The given parameters 
are 
+  the reference of the component which is a clone of the current one, and 
some 
+  controller-dependant hints which carry additional information to perform 
this 
+  cloning.</li>
+</ul>
+
+<p>To summarize, the AOKell component factory guarantees that, whatever the 
+implementation of the controller is, the invocation order for a newly 
created 
+controller is:</p>
+
+<ol>
+  <li>no-argument constructor</li>
+  <li><code>setFcCompCtrl</code> method</li>
+  <li><code>initFcCtrl</code> method</li>
+</ol>
+
+<p>As a matter of example, the
+<a 
href="../examples/BasicLoggerControllerImpl.java">BasicLoggerControllerImpl</a>
 
+class is the implementation of our chosen Logger controller.</p>
+
+<h4>Step 3: Registering the controller</h4>
+
+<p>The last step consists in adding our Logger controller into an existing 
+membrane or to create a new membrane. In both cases the principle is the 
same. 
+We illustrate the first case.</p>
+
+<p>The o.o.f.aokell.AOKellMembranes class defines the getMembranes() method 
+which returns a description of existing membranes. This method is called by 
the 
+component factory when a membrane must be created for a new component. 
Membranes 
+are described by an array of MembraneDef instances.</p>
+
+<p>Each MembraneDef instance contains:</p>
+
+<ul>
+  <li>the name of the membrane as a string (e.g. &quot;primitive&quot;, 
&quot;composite&quot;, 
+  etc.),</li>
+  <li>an array of ControllerDef instances,</li>
+  <li>the marker type for the membrane (e.g. PrimitiveType, CompositeType, 
etc.).</li>
+</ul>
+
+<p>Each ControllerDef instance describes a controller associated to the 
membrane 
+and contains:</p>
+
+<ul>
+  <li>the Fractal
+<a 
href="http://fractal.objectweb.org/current/doc/javadoc/fractal/org/objectweb/fractal/api/type/InterfaceType.html";>
+InterfaceType</a> of the control interface,</li>
+  <li>the Java class implementing the controller (e.g.
+<a 
href="../examples/BasicLoggerControllerImpl.java">BasicLoggerControllerImpl</a>).</li>
+</ul>
+
+<p>As a matter of example, we can add our Logger controller to the primitive 
+membrane by appending the following lines at the end of the ControllerDef 
array 
+associated to the primitive membrane:</p>
+
+<p><code>new </code><code>ControllerDef</code><code>(<br>
+&nbsp; new InterfaceTypeImpl(<br>
+&nbsp;&nbsp;&nbsp; &quot;logger-controller&quot;,<br>
+&nbsp;&nbsp;&nbsp; LoggerControllerItf.class.getName(),<br>
+&nbsp;&nbsp;&nbsp; false,&nbsp;&nbsp;&nbsp; // server interface<br>
+&nbsp;&nbsp;&nbsp; false,&nbsp;&nbsp;&nbsp; // mandatory<br>
+&nbsp;&nbsp;&nbsp; false&nbsp;&nbsp;&nbsp;&nbsp; // singleton<br>
+&nbsp; ),<br>
+&nbsp; BasicLoggerControllerImpl.class<br>
+); </code></p>
+
+<p>Once this has been done, all created primitive components hold a new 
control 
+interface named logger-controller which can be retrieve, as any other 
control 
+interface, by calling getFcInterface() on the 
+<a 
href="http://fractal.objectweb.org/current/doc/javadoc/fractal/org/objectweb/fractal/api/Component.html";>Component</a>
 reference.</p>
+
+<h4>8.2.2 POJO controllers with glue code</h4>
+
+<p>The previous process illustrates the writing of a POJO controller with is 
+registered with a membrane and which can be retrieved via the
+<a 
href="http://fractal.objectweb.org/current/doc/javadoc/fractal/org/objectweb/fractal/api/Component.html";>Component</a>
 
+controller. This section extends this process for controller which needs to 
be 
+more tightly coupled with component implementations and which need to 
perform 
+code injection or interception. In this case, some glue code needs to be 
+provided.</p>
+
+<p>The process of writing a POJO controller with glue code goes through the 
five following 
+steps:</p>
+
+<ol>
+  <li>Determining the control interface</li>
+  <li>Implementing the controller</li>
+  <li>Defining a marker interface</li>
+  <li>Writing the glue</li>
+  <li>Registering the controller</li>
+</ol>
+
+<p>Steps 1, 2 and 5 are identical to the ones presented in Section 8.2.1. In 
the 
+remainder of this section, we only details steps 3 and 4.</p>
+
+<h4>Step 3: Defining a marker interface</h4>
+
+<p>This step consists in writing a marker type for our new controller. A 
+marker type is an interface, such as java.io.Serializable, whose role is 
+to tag a class with a particular property. In our case, we want to let know 
that 
+our component will be put under the control of our Logger controller. As we 
will 
+see it in the next step, marker types are used by the glue code to introduce 
the 
+elements needed by each controller.</p>
+
+<p>Marker interfaces must extends the o.o.f.aokell.lib.membrane.BaseType 
+interface defined by AOKell. The <a href="../examples/DreamLogType.java">
+DreamLogType</a> interface defines our marker type.</p>
+
+<p>Note that marker types are most of the time grouped together to form 
+aggregate marker types for membranes. For example, 
o.o.f.aokell.lib.membrane.primitive.PrimitiveType extends the marker types of 
+all controllers contained in a primitive membrane. Although this is not 
+mandatory, this interface can then be extended to include our new marker 
type.</p>
+
+<h4>Step 4: Writing the glue</h4>
+
+<p>The glue code for a given controller selects the classes 
+implementing the associated marker type and performs any transformation 
needed 
+by this controller. These transformations usually take two forms:</p>
+
+<ul>
+  <li>methods and interface injection: a component class is extended with 
some 
+  methods and implements a new interface. This is usually the control 
interface 
+  (in our case 
+<a href="../examples/LoggerControllerItf.java">LoggerControllerItf</a>) and 
its associated methods.</li>
+  <li>methods interception: some before and/or after treatments may be 
+  associated to each method of a component. For example, the lifecycle 
+  controller blocks method executions on a stopped component.</li>
+</ul>
+
+<p>Of course, the transformations can take any other forms which is required 
by 
+the controller.</p>
+
+<p>Two versions of the glue feature of AOKell are available: Spoon or 
AspectJ. 
+When Spoon is used (which is the default case) a processor must be written. 
In 
+the case of AspectJ, an aspect must be written. As a matter of example, the 
+classes <a href="../examples/LoggerControllerProcessor.java">
+LoggerControllerProcessor</a> and
+<a 
href="../examples/LoggerControllerTemplate.java">LoggerControllerTemplate</a> 
implement the Spoon glue code, and the
+<a href="../examples/ALoggerController.aj">ALoggerController</a> aspect 
+implements the AspectJ version.</p>
+
+<p>This document does not go into the details of programming with
+<a href="http://spoon.gforge.inria.fr/";>Spoon</a> or
+<a href="http://www.eclipse.org/aspectj/";>AspectJ</a>. The reader is either 
+supposed to be familiar with these tools, or to refer to their respective 
web 
+sites for documentation.</p>
+
+<h3>8.2 Component controllers</h3>
+
+<p>When componentized membranes are used, e.g. when the membrane feature is 
set 
+to comp, the process of writing a controller goes through the following six 
+steps:</p>
+
+<ol>
+  <li>Determining the control interface</li>
+  <li>Implementing the controller</li>
+  <li>Defining a marker interface</li>
+  <li>Writing the glue</li>
+  <li>Membrane architecture description</li>
+  <li>Registering the membrane</li>
+</ol>
+
+<p>Steps 1 to are identical to the ones presented in the previous section. 
As 
+with POJO controller, it is not mandatory for component controllers to be 
+associated with glue code. Hence, steps 3 and 4 can be skipped. For clarity 
sake, 
+the following description assumes that this is not the case. </p>
+
+<p>Although step 2, Implementing the controller, does not differ from the 
POJO 
+version, two points can be mentioned:</p>
+
+<ul>
+  <li>The compctrl reference transmitted to setFcCompCtrl is the reference 
of the 
+  M2-level component controller (see Section <a 
href="#controllingControllers">Controlling the Controllers</a>) 
+  and not the reference of the M1-level component controller as this is the 
case 
+  with POJO controllers.</li>
+  <li>The controller implementation is the content of a so-called control 
+  component, which is a regular Fractal component. Hence:<ul>
+    <li>the Fractal API can be used to manipulate these components,</li>
+    <li>these components provide a
+    <a 
href="http://fractal.objectweb.org/current/doc/javadoc/fractal/org/objectweb/fractal/api/control/BindingController.html";>
+    BindingController</a>, a
+    <a 
href="http://fractal.objectweb.org/current/doc/javadoc/fractal/org/objectweb/fractal/api/control/NameController.html";>
+    NameController</a> and a
+    <a 
href="http://fractal.objectweb.org/current/doc/javadoc/fractal/org/objectweb/fractal/api/control/SuperController.html";>
+    SuperController</a> interface,</li>
+    <li>composite control components can be used and, in this case, a
+    <a 
href="http://fractal.objectweb.org/current/doc/javadoc/fractal/org/objectweb/fractal/api/control/ContentController.html";>
+    ContentController</a> interface is also available,</li>
+    <li>collection interfaces are supported,</li>
+    <li>note however that:<ul>
+      <li>these control components are unstoppable and do not provide a 
+      lifecycle control interface,</li>
+      <li>template control components are not supported.</li>
+    </ul>
+    </li>
+  </ul>
+  </li>
+</ul>
+
+<h4>Step 5: Membrane architecture description</h4>
+
+<p>As described in Section <a href="#featureMembrane">Feature membrane</a>, 
the 
+componentization of control membranes reify the communication paths and the 
+dependencies between controllers. The purpose is to apply to the development 
of 
+the membrane the concepts which have been applied to the development of 
+applications when components were introduced.</p>
+
+<p>A control membrane is then an assembly of control components described 
with 
+Fractal-ADL. Two new controller descriptions have been introduced: <code>
+mComposite</code> and <code>mPrimitive</code>. They correspond respectively, 
to 
+a composite control component and to a primitive control component. A 
control 
+membrane is then a <code>mComposite </code>component containing other <code>
+mComposite</code> or <code>mPrimitive </code>sub-components. The interfaces 
+exported by the root <code>mComposite</code> component are the control 
+interfaces provided by the application-level component controlled by this 
+membrane.</p>
+
+<p>When a new membrane is requested to the membrane factory, the 
corresponding 
+Fractal-ADL assembly is instantiated. However, this is not the XML 
definition of 
+the assembly, but its Java description generated by a static Fractal-ADL 
Java 
+backend which is used. This solution is slightly less flexible (indeed, Java 
+descriptions must be regenerated whenever the XML descriptions change), but 
is 
+more performant (executing a block of Java code is far less costly than 
parsing 
+and interpreting an XML document.)</p>
+
+<p>In the case of our example, the Logger controller can be inserted in an 
+existing membrane or in a new one. We illustrate the first case by extending 
the 
+primitive membrane with this controller. The
+<a href="../examples/Primitive.fractal">Primitive</a>,
+<a href="../examples/LoggerController.fractal">LoggerController</a> and
+<a href="../examples/LoggerControllerType.fractal">LoggerControllerType</a> 
+definitions implement this extension. </p>
+
+<h4>Step 6: Registering the membrane</h4>
+
+<p>As with the POJO version, componentized membranes need to be registered 
in 
+the AOKellMembrane class. However, the definition of MembraneDef changes for 
+componentized membranes. It contains:</p>
+
+<ul>
+  <li>the name of the membrane as a string (e.g. &quot;primitive&quot;, 
&quot;composite&quot;, 
+  etc.),</li>
+  <li>the name of the control membrane Fractal-ADL definition as a string 
(in 
+  our case 
&quot;org.objectweb.fractal.aokell.lib.membrane.primitive.Primitive&quot;),</li>
+  <li>the marker type for the membrane (e.g. PrimitiveType, CompositeType, 
etc.).</li>
+</ul>
+
+<p>Once this has been done, all created primitive control membranes contain 
a 
+LogC control component which export a logger-controller interface. This 
+interface is available for the application component controlled by this 
+membrane.</p>
+
+<h2><a name="conclusion"></a>9 Conclusion</h2>
+
+<p>This document presents AOKell which is INRIA and France Telecom's 
+implementation of the Fractal component model. This is a full Java 
+implementation (level 3.3) of the Fractal Specifications.</p>
+
+<p>The difference between AOKell and other existing implementations is that 
AOKell uses Aspect-Oriented Programming and the AspectJ language for 
+implementing controllers and membranes. In our opinion, compared to other 
+techniques such as mixins, this leads to a controller development style 
which is 
+easier to understand, debug and maintain. We have shown in this document 
that, 
+while providing a high level of abstraction for programming controllers as 
+aspects, Fractal applications developed with AOKell do not suffer from 
runtime 
+penalties: performances of AOKell applications are similar to those 
developed 
+with Julia.</p>
+
+<p>We believe that this experiment shows that AOP and AspectJ are mature 
tools 
+for engineering complex applications such as the ones developed with Fractal 
+components.</p>
+
+<h2>Acknowledgment</h2>
+
+<p>This work is partially funded by France Telecom under the external 
research 
+contract #46131097.</p>
+
+<h2>References</h2>
+<p><a name="bibFractal"></a>[1] E. Bruneton, T. Coupaye, M. Leclercq, V. 
Quema, 
+J.-B. Stefani. <i>An Open Component Model and Its Support in Java</i>. 7th 
+International Symposium on Component-Based Software Engineering (<a 
href="http://www.sei.cmu.edu/pacc/CBSE7/";>CBSE-7</a>), 
+LNCS 3054, pp. 7-22, May 2004, Springer.<br>
+<a name="bibAOP"></a>[2] G. Kiczales, J. Lamping, A. Mendhekar, C. Maeda, C. 
+Lopes, J.-M. Loingtier, J. Irwin. <i>Aspect-Oriented Programming</i>. 11th 
+European Conference on Object-Oriented Programming (ECOOP'97), LNCS 1241, 
pp. 
+220-242, June 1997, Springer.<br>
+<a name="bibSpoon"></a>[3] R. Pawlak. <i>
+<a 
href="http://middleware05.objectweb.org/WSProceedings/AOMD05/a6-pawlak.pdf";>
+Spoon: Annotation-Driven Program Transformation the AOP Case</a></i>. 1st 
+International Workshop on Aspect-Oriented Middleware Development (<a 
href="http://middleware05.objectweb.org/WSProceedings/AOMD05/index.html";>AOMD'05</a>)
 
+ &#64; ACM/IFIP/Usenix <a 
href="http://middleware05.objectweb.org";>Middleware'05</a>, 
+November 2005.</p>
+
+<h2>Document history</h2>
+<ul>
+  <li>3/8/06 : Section Writing new Control Membranes added</li>
+  <li>2/8/06 :  Spoon-related information added (v2.0)<br>
+&nbsp;</li>
+  <li>1/10/06 : Section Features added</li>
+  <li>12/8/05 : Sections on membrane types and component 
+  structure updated</li>
+  <li>4/24/05 : Initial release of this document (v1.0)</li>
+</ul>
+
+<hr>
+
+<p align="left"><i><a href="mailto:Lionel.Seinturier@xxxxxxx";>Lionel 
Seinturier</a>,
+<a href="mailto:Nicolas.Pessemier@xxxxxxx";>Nicolas Pessemier</a>,
+<a href="mailto:thierry.coupaye@xxxxxxxxxxxxxxxxx";>Thierry Coupaye</a>.<br>
+</i>Last modified:
+<!--webbot bot="Timestamp" S-Type="EDITED" S-Format="%m/%d/%y" startspan 
-->03/30/06<!--webbot bot="Timestamp" endspan i-checksum="13002" -->.</p>
+
+</BODY>
+</HTML>
\ No newline at end of file
Index: web/postprocess.sh
diff -u web/postprocess.sh:1.3 web/postprocess.sh:1.4
--- web/postprocess.sh:1.3      Tue Mar 16 12:29:44 2004
+++ web/postprocess.sh  Thu Mar 30 11:33:07 2006
@@ -23,3 +23,7 @@
 cd ../jmx
 sed -e '/TOBEREPLACED/r body.html' -e '/TOBEREPLACED/d' index-holder.html > 
index.html
 sed -e '/TOBEREPLACED/r body.html' -e '/TOBEREPLACED/d' -e '/- Fractal JMX 
tutorial/d' index-holder_print.html > index_print.html
+
+cd ../aokell
+sed -e '/TOBEREPLACED/r overview.html' -e '/TOBEREPLACED/d' 
index-holder.html | sed -e 's/..\/figures\//figures\//' | sed -e 
's/..\/examples\//examples\//' > index.html
+sed -e '/TOBEREPLACED/r overview.html' -e '/TOBEREPLACED/d' -e '/- AOKell 
documentation/d' index-holder_print.html | sed -e 
's/..\/figures\//figures\//' > index_print.html
Index: web/xml/root/doc/index.xml
diff -u web/xml/root/doc/index.xml:1.12 web/xml/root/doc/index.xml:1.13
--- web/xml/root/doc/index.xml:1.12     Tue Feb 21 14:06:41 2006
+++ web/xml/root/doc/index.xml  Thu Mar 30 11:33:07 2006
@@ -45,12 +45,26 @@
       <p>The goal of this sub project is to provide implementations
       of the Fractal component model.</p>
 
-      <p>Julia is the reference implementation of the Fractal component
-      model in Java. The <a href="../tutorials/julia/index.html">Julia
+         <ul>
+
+      <li><strong>Julia</strong> is the reference implementation of the
+         Fractal component model in Java.
+         The <a href="../tutorials/julia/index.html">Julia
       Tutorial</a> explains how Julia can be configured. The
       <a href="../current/doc/javadoc/julia/overview-summary.html">Julia
       API</a> documentation explains how Julia is designed and
-      implemented.</p>
+      implemented.</li>
+
+         <li><strong><a 
href="../tutorials/aokell/index.html">AOKell</a></strong>
+         is another full implementation of the specifications in Java.
+         AOKell differs from Julia, in the way control membrane and
+         components are glued together (AOKell uses aspect-oriented
+         programming for that), and in the way control membranes are
+         implemented (AOKell proposes the notion of a control component
+         and of assemblies of control components for implementing membranes).
+         </li>
+
+         </ul>
 
       <!--p>ProActive is another implementation, which is conform to the 3.2
       <a 
href="../specification/index.html#sub:Conformance-levels">conformance
Index: web/xml/root/download/index.xml
diff -u web/xml/root/download/index.xml:1.6 
web/xml/root/download/index.xml:1.7
--- web/xml/root/download/index.xml:1.6 Tue Mar 16 12:29:44 2004
+++ web/xml/root/download/index.xml     Thu Mar 30 11:33:07 2006
@@ -43,6 +43,7 @@
     <li><em>fractaljmx</em>: used to get the Fractal JMX agent.</li>
     <li><em>fractalswing</em>: used to get the Fractal Swing components.</li>
     <li><em>julia</em>: used to get the Julia reference implementation.</li>
+    <li><em>aokell</em>: used to get the AOKell implementation.</li>
     <li><em>examples</em>: used to get the Fractal examples.</li>
     <li><em>web</em>: used to get the Fractal web site.</li>
     </ul>
Index: web/xml/root/index.xml
diff -u web/xml/root/index.xml:1.9 web/xml/root/index.xml:1.10
--- web/xml/root/index.xml:1.9  Fri Feb 17 13:28:37 2006
+++ web/xml/root/index.xml      Thu Mar 30 11:33:07 2006
@@ -83,10 +83,10 @@
 including non ObjectWeb projects:</p>
 
 <ul>
-<li><a href="http://aofractal.gforge.inria.fr/";>AOKell</a> 
+<li><a href="tutorials/aokell/index.html">AOKell</a> 
 is an implementation similar to Julia, but based on AspectJ instead of 
mixins. 
 It can execute the same applications as Julia, including Fractal RMI, 
Fractal 
-ADL, Fractal Explorer...</li>
+ADL, Fractal Explorer.</li>
 <li><a href="http://csl.ensm-douai.fr/FracTalk";>FracTalk</a> is a SmallTalk 
 implementation of the Fractal component model.</li>
 <li><a href="http://www-adele.imag.fr/fractnet/";>FractNet</a> is a .Net 
Index: web/xml/root/tutorials/aokell/index-holder.xml
diff -u /dev/null web/xml/root/tutorials/aokell/index-holder.xml:1.1
--- /dev/null   Thu Mar 30 11:33:09 2006
+++ web/xml/root/tutorials/aokell/index-holder.xml      Thu Mar 30 11:33:07 
2006
@@ -0,0 +1,17 @@
+<?xml version="1.0" encoding="ISO-8859-1" standalone="no"?>
+
+<!DOCTYPE document SYSTEM '../../../../common/dtd/objectweb.dtd'>
+
+<document>
+
+  <properties>
+    <author email="fractal@xxxxxxxxxxxxx">fractal-team</author>
+    <title>AOKell Documentation</title>
+    <filename>index.xml</filename>
+    <pathtoroot>../..</pathtoroot>
+  </properties>
+
+  <body>
+    <s1 name="TOBEREPLACED"/>
+  </body>
+</document>



<--  Date Index  --> <--  Thread Index  -->

Reply via email to:

Powered by MHonArc.

Copyright © 2006-2007, OW2 Consortium | contact | webmaster.