edu.bonn.xulu.appl
Class XuluRegistry

java.lang.Object
  extended by AbstractObjectTraceable
      extended by edu.bonn.xulu.appl.XuluRegistry
All Implemented Interfaces:
XuluComponent, XuluConstants

public class XuluRegistry
extends AbstractObjectTraceable
implements XuluComponent

In der Xulu-Registry werden alle dynamischen Komponenten registriert, die in der Xulu-Applikation verwendet werden sollen. Hierzu zaehlen

Daneben bietet die Registry Listen, in denen die letzten Daten-Importe, Daten-Exporte und Script-Ausfuehrungen hinterlegt sind.

Die Registry fungiert als AbstractObjectTraceable, so dass ObjectListener angeschlossen werden koennen, welche automatisch durch ein XuluRegistry.ChangeEvent informiert werden, wenn sich der Inhalt der Registry aendert.

Version:
1.0
Author:
Martin Schmitz (University of Bonn/Germany)

Nested Class Summary
static class XuluRegistry.ChangeEvent
          Diese Ereignis wird erzeugt (und an alle schmitzm.data.event.ObjectListener gesendet), wenn sich der Inhalt der Xulu-Registrierung aendert (ein Objekt hingefuegt, entfernt oder ersetzt wurde).
 
Field Summary
 
Fields inherited from interface edu.bonn.xulu.appl.XuluConstants
EXTENTION_BUNDLE, ICONS_DIR, LOCALES_BASE, RESOURCE_DIR, SWING_RES, VERSION, VERSION_DATE, XULU_ICON, XULU_INFOICON, XULU_STARTICON, XULU_VIS_RES, XULUERR_RES, XULUGUI_RES
 
Constructor Summary
XuluRegistry()
          Erzeugt eine neue (leere) Registry.
 
Method Summary
protected  XuluRegistry.ChangeEvent createGeneralEvent()
          Ueberschreibt AbstractObjectTraceable#createGeneralEvent(), damit ein XuluRegistry.ChangeEvent zurueckgegeben wird.
 void dispose()
          Zerstoert den Manager und alle darin enthaltenen Komponenten.
 XuluPlugin[] getAutostartPlugins()
          Liefert alle registrierten Autostart-Plugins.
 Class[] getDataTypes()
          Liefert alle registrierten Datentypen.
 InstantiationFactory[] getDefaultFactories()
          Liefert alle registrierten Standard-Factorys.
 InstantiationFactory[] getDefaultFactories(String name)
          Liefert alle Default-Factorys, die einen bestimmten Namen besitzen.
 InstantiationFactory getDefaultFactory(Class type)
          Liefert eine Datentyp-Factory aus der Xulu-Registry.
 ExportFactory[] getExportFactories()
          Liefert alle registrierten Export-Factorys.
 ExportFactory[] getExportFactories(Class type)
          Liefert eine Export-Factory aus der Xulu-Registry.
 ExportFactory[] getExportFactories(String name)
          Liefert alle Export-Factorys, die einen bestimmten Namen besitzen.
 ImportFactory[] getImportFactories()
          Liefert alle registrierten Import-Factorys.
 ImportFactory[] getImportFactories(Class type)
          Liefert alle Import-Factorys zu einem Datentyp.
 ImportFactory[] getImportFactories(String name)
          Liefert alle Import-Factorys, die einen bestimmten Namen besitzen.
 Class[] getModelClasses()
          Liefert alle registrierten Modellkassen.
 XuluPlugin[] getPlugins()
          Liefert alle registrierten Xulu-Plugins.
 RecentImports getRecentImports()
          Liefert eine Liste, in der die letzten Daten-Importe hinterlegt werden.
 RecentScripts getRecentScripts()
          Liefert eine Liste, in der die letzten Script-Aufrufe hinterlegt werden.
 ScriptInterpreter[] getScriptInterpreter()
          Liefert alle registrierten Skript-Interpreter.
 ScriptInterpreter[] getScriptInterpreter(String name)
          Liefert alle Skript-Interpreter, die einen bestimmten Namen besitzen.
 TypeMapping getTypeMapping(Class type)
          Liefert ein TypeMapping aus der Xulu-Registry.
 TypeMapping[] getTypeMappings()
          Liefert alle registrierten TypeMappings.
 Class[] getVisualisationTools()
          Liefert alle registrierten Visualisierungstools.
 boolean isAutostartPluginRegistered(XuluPlugin plugin)
          Prueft, ob ein Plugin als Autostart-Plugin registriert ist.
 boolean isDataTypeRegistered(Class type)
          Prueft, ob ein Datentyp registriert ist.
 boolean isDefaultFactoryRegistered(InstantiationFactory fac)
          Prueft, ob eine Standard-Factory registriert ist.
 boolean isDisposed()
          Prueft, ob der Manager zerstoert ist.
 boolean isExportFactoryRegistered(ExportFactory fac)
          Prueft, ob eine Export-Factory registriert ist.
 boolean isImportFactoryRegistered(ImportFactory fac)
          Prueft, ob eine Import-Factory registriert ist.
 boolean isModelClassRegistered(Class modelClass)
          Prueft, ob eine Modellklasse registriert ist.
 boolean isPluginRegistered(XuluPlugin plugin)
          Prueft, ob ein Plugin registriert ist.
 boolean isScriptInterpreterRegistered(ScriptInterpreter interpreter)
          Prueft, ob ein Skript-Interpreter registriert ist.
 boolean isTypeMappingRegistered(TypeMapping mapping)
          Prueft, ob ein TypeMapping (fuer den Datentyp) registriert ist.
 boolean isVisualisationToolRegistered(Class toolClass)
          Prueft, ob eine Visualisierungstool registriert ist.
 boolean register(Object obj)
          Registriert ein Objekt.
 boolean registerAutostartPlugin(XuluPlugin plugin)
          Registriert ein Xulu-Plugin als Autostart-Plugin.
 boolean registerDataType(Class type)
          Registriert einen Datentyp.
 boolean registerDefaultFactory(InstantiationFactory fac)
          Registriert eine Standard-Factory.
 boolean registerExportFactory(ExportFactory fac)
          Registriert eine Export-Factory.
 boolean registerImportFactory(ImportFactory fac)
          Registriert eine Import-Factory.
 boolean registerModelClass(Class modelClass)
          Registriert eine Modellklasse.
 boolean registerPlugin(XuluPlugin plugin)
          Registriert ein Xulu-Plugin.
 boolean registerScriptInterpreter(ScriptInterpreter interpreter)
          Registriert einen Skript-Interpreters.
 boolean registerTypeMapping(TypeMapping mapping)
          Registriert ein TypeMapping.
 boolean registerVisualisationTool(Class toolClass)
          Registriert ein Visualisierungstool.
 boolean replaceAutostartPlugin(XuluPlugin pluginOld, XuluPlugin pluginNew)
          Ersetzt die Registrierung eines Xulu-Plugins als Autostart-Plugin durch eine andere.
 boolean replaceDataType(Class typeOld, Class typeNew)
          Ersetzt die Registrierung eines Datentyps durch einen anderen.
 boolean replaceDefaultFactory(InstantiationFactory facOld, InstantiationFactory facNew)
          Ersetzt die Registrierung einer Standard-Factory durch eine andere.
 boolean replaceExportFactory(ExportFactory facOld, ExportFactory facNew)
          Ersetzt die Registrierung einer Export-Factory durch eine andere.
 boolean replaceImportFactory(ImportFactory facOld, ImportFactory facNew)
          Ersetzt die Registrierung einer Import-Factory durch eine andere.
 boolean replaceModelClass(Class modelOld, Class modelNew)
          Ersetzt die Registrierung einer Modellklasse durch eine andere.
 boolean replacePlugin(XuluPlugin pluginOld, XuluPlugin pluginNew)
          Ersetzt die Registrierung eines Xulu-Plugins durch eine andere.
 boolean replaceScriptInterpreter(ScriptInterpreter interpreterOld, ScriptInterpreter interpreterNew)
          Ersetzt die Registrierung einer Skript-Interpreters durch einen andere.
 boolean replaceTypeMapping(TypeMapping mapOld, TypeMapping mapNew)
          Ersetzt die Registrierung eines TypeMappings durch ein anderes.
 boolean replaceVisualisationTool(Class toolOld, Class toolNew)
          Ersetzt die Registrierung eines Visualisierungstools durch ein andere.
 boolean unregisterAutostartPlugin(XuluPlugin plugin)
          Entfernt die Registrierung eines Xulu-Plugins als Autostart-Plugin.
 boolean unregisterDataType(Class type)
          Entfernt die Registrierung eines Datentyps.
 boolean unregisterDefaultFactory(InstantiationFactory fac)
          Entfernt die Registrierung einer Standard-Factory.
 boolean unregisterExportFactory(ExportFactory fac)
          Entfernt die Registrierung einer Export-Factory.
 boolean unregisterImportFactory(ImportFactory fac)
          Entfernt die Registrierung einer Import-Factory.
 boolean unregisterModelClass(Class modelClass)
          Entfernt die Registrierung einer Modellklasse.
 boolean unregisterPlugin(XuluPlugin plugin)
          Entfernt die Registrierung eines Xulu-Plugins.
 boolean unregisterScriptInterpreter(ScriptInterpreter interpreter)
          Entfernt die Registrierung eines Skript-Interpreters.
 boolean unregisterTypeMapping(TypeMapping mapping)
          Entfernt die Registrierung eines TypeMappings.
 boolean unregisterVisualisationTool(Class toolClass)
          Entfernt die Registrierung eines Visualisierungstool.
 
Methods inherited from class java.lang.Object
clone, equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait
 

Constructor Detail

XuluRegistry

public XuluRegistry()
Erzeugt eine neue (leere) Registry.

Method Detail

dispose

public void dispose()
Zerstoert den Manager und alle darin enthaltenen Komponenten.

Specified by:
dispose in interface XuluComponent

isDisposed

public boolean isDisposed()
Prueft, ob der Manager zerstoert ist.

Specified by:
isDisposed in interface XuluComponent
See Also:
dispose()

createGeneralEvent

protected XuluRegistry.ChangeEvent createGeneralEvent()
Ueberschreibt AbstractObjectTraceable#createGeneralEvent(), damit ein XuluRegistry.ChangeEvent zurueckgegeben wird.


register

public boolean register(Object obj)
Registriert ein Objekt. Dieses wird (wenn moeglich) fuer alle folgenden Punkte registriert:

Parameters:
obj - ein beliebiges Objekt
Returns:
true wenn mindestens eine neue Registrierung erfolgt ist

registerDataType

public boolean registerDataType(Class type)
Registriert einen Datentyp. Hierfuer koennen nur (Sub)Klassen von XuluObject angegeben werden.

Parameters:
type - Datentyp
Returns:
false falls der Datentyp bereits registriert ist
Throws:
UnsupportedOperationException - falls der angegebene Typ nicht einem XuluObject entspricht

unregisterDataType

public boolean unregisterDataType(Class type)
Entfernt die Registrierung eines Datentyps.

Parameters:
type - Datentyp
Returns:
false falls der Datentyp nicht registriert war

replaceDataType

public boolean replaceDataType(Class typeOld,
                               Class typeNew)
Ersetzt die Registrierung eines Datentyps durch einen anderen.

Parameters:
typeOld - zu ersetzender Datentyp
typeNew - neuer Datentyp
Returns:
false falls typeOld nicht registriert war und deshalb keine Ersetzung moeglich ist
Throws:
UnsupportedOperationException - falls der neue Typ nicht einem XuluObject entspricht

isDataTypeRegistered

public boolean isDataTypeRegistered(Class type)
Prueft, ob ein Datentyp registriert ist.


getDataTypes

public Class[] getDataTypes()
Liefert alle registrierten Datentypen.


registerDefaultFactory

public boolean registerDefaultFactory(InstantiationFactory fac)
Registriert eine Standard-Factory.

Parameters:
fac - Factory
Returns:
false falls die Factory bereits registriert ist

unregisterDefaultFactory

public boolean unregisterDefaultFactory(InstantiationFactory fac)
Entfernt die Registrierung einer Standard-Factory.

Parameters:
fac - Factory
Returns:
false falls die Factory nicht registriert war

replaceDefaultFactory

public boolean replaceDefaultFactory(InstantiationFactory facOld,
                                     InstantiationFactory facNew)
Ersetzt die Registrierung einer Standard-Factory durch eine andere.

Parameters:
facOld - zu ersetzende Factory
facNew - neue Factory
Returns:
false falls facOld nicht registriert war und deshalb keine Ersetzung moeglich ist

isDefaultFactoryRegistered

public boolean isDefaultFactoryRegistered(InstantiationFactory fac)
Prueft, ob eine Standard-Factory registriert ist.


getDefaultFactories

public InstantiationFactory[] getDefaultFactories()
Liefert alle registrierten Standard-Factorys.


getDefaultFactories

public InstantiationFactory[] getDefaultFactories(String name)
Liefert alle Default-Factorys, die einen bestimmten Namen besitzen.

Parameters:
name - Bezeichnung der Factory
Returns:
ein leerer DeafultFactory-Array, falls zu der Bezeichnung keine Factory registriert ist

registerImportFactory

public boolean registerImportFactory(ImportFactory fac)
Registriert eine Import-Factory.

Parameters:
fac - Factory
Returns:
false falls die Factory bereits registriert ist

unregisterImportFactory

public boolean unregisterImportFactory(ImportFactory fac)
Entfernt die Registrierung einer Import-Factory.

Parameters:
fac - Factory
Returns:
false falls die Factory nicht registriert war

replaceImportFactory

public boolean replaceImportFactory(ImportFactory facOld,
                                    ImportFactory facNew)
Ersetzt die Registrierung einer Import-Factory durch eine andere.

Parameters:
facOld - zu ersetzende Factory
facNew - neue Factory
Returns:
false falls facOld nicht registriert war und deshalb keine Ersetzung moeglich ist

isImportFactoryRegistered

public boolean isImportFactoryRegistered(ImportFactory fac)
Prueft, ob eine Import-Factory registriert ist.


getImportFactories

public ImportFactory[] getImportFactories()
Liefert alle registrierten Import-Factorys.


getImportFactories

public ImportFactory[] getImportFactories(String name)
Liefert alle Import-Factorys, die einen bestimmten Namen besitzen.

Parameters:
name - Bezeichnung der Factory
Returns:
ein leerer ImportFactory-Array, falls zu der Bezeichnung keine Factory registriert ist

registerExportFactory

public boolean registerExportFactory(ExportFactory fac)
Registriert eine Export-Factory.

Parameters:
fac - Factory
Returns:
false falls die Factory bereits registriert ist

unregisterExportFactory

public boolean unregisterExportFactory(ExportFactory fac)
Entfernt die Registrierung einer Export-Factory.

Parameters:
fac - Factory
Returns:
false falls die Factory nicht registriert war

replaceExportFactory

public boolean replaceExportFactory(ExportFactory facOld,
                                    ExportFactory facNew)
Ersetzt die Registrierung einer Export-Factory durch eine andere.

Parameters:
facOld - zu ersetzende Factory
facNew - neue Factory
Returns:
false falls facOld nicht registriert war und deshalb keine Ersetzung moeglich ist

isExportFactoryRegistered

public boolean isExportFactoryRegistered(ExportFactory fac)
Prueft, ob eine Export-Factory registriert ist.


getExportFactories

public ExportFactory[] getExportFactories()
Liefert alle registrierten Export-Factorys.


getExportFactories

public ExportFactory[] getExportFactories(String name)
Liefert alle Export-Factorys, die einen bestimmten Namen besitzen.

Parameters:
name - Bezeichnung der Factory
Returns:
ein leerer ExportFactory-Array, falls zu der Bezeichnung keine Factory registriert ist

registerTypeMapping

public boolean registerTypeMapping(TypeMapping mapping)
Registriert ein TypeMapping. War bereits ein TypeMapping fuer den entsprechenden Datentyp registriert, wird das bestehende TypeMapping ersetzt.
Sind die darin enthaltenen Komponenten (Datentyp, Factorys, ...) noch nicht registriert, werden diese ebenfalls in die XuluRegistry aufgenommen.

Parameters:
mapping - TypeMapping
Returns:
true

unregisterTypeMapping

public boolean unregisterTypeMapping(TypeMapping mapping)
Entfernt die Registrierung eines TypeMappings.

Parameters:
mapping - TypeMapping
Returns:
false falls das TypeMapping nicht registriert war

replaceTypeMapping

public boolean replaceTypeMapping(TypeMapping mapOld,
                                  TypeMapping mapNew)
Ersetzt die Registrierung eines TypeMappings durch ein anderes.

Parameters:
mapOld - zu ersetzendes TypeMapping
mapNew - neues TypeMapping
Returns:
false falls mapOld nicht registriert war und deshalb keine Ersetzung moeglich ist

isTypeMappingRegistered

public boolean isTypeMappingRegistered(TypeMapping mapping)
Prueft, ob ein TypeMapping (fuer den Datentyp) registriert ist.


getTypeMappings

public TypeMapping[] getTypeMappings()
Liefert alle registrierten TypeMappings.


getTypeMapping

public TypeMapping getTypeMapping(Class type)
Liefert ein TypeMapping aus der Xulu-Registry.

Parameters:
type - Datentyp
Returns:
null falls zu dem Datentyp kein TypeMapping registriert ist

getDefaultFactory

public InstantiationFactory getDefaultFactory(Class type)
Liefert eine Datentyp-Factory aus der Xulu-Registry.

Parameters:
type - Datentyp
Returns:
null falls zu dem Datentyp kein TypeMapping registriert ist

getImportFactories

public ImportFactory[] getImportFactories(Class type)
Liefert alle Import-Factorys zu einem Datentyp.

Parameters:
type - Datentyp
Returns:
ein leerer ImportFactory-Array, falls zu dem Datentyp kein TypeMapping registriert ist

getExportFactories

public ExportFactory[] getExportFactories(Class type)
Liefert eine Export-Factory aus der Xulu-Registry.

Parameters:
type - Datentyp
Returns:
ein leerer ExportFactory-Array, falls zu dem Datentyp kein TypeMapping registriert ist

registerVisualisationTool

public boolean registerVisualisationTool(Class toolClass)
Registriert ein Visualisierungstool.

Parameters:
toolClass - Visualisierungstool
Returns:
false falls das Visualisierungstool bereits registriert ist

unregisterVisualisationTool

public boolean unregisterVisualisationTool(Class toolClass)
Entfernt die Registrierung eines Visualisierungstool.

Parameters:
toolClass - Visualisierungstool
Returns:
false falls das Visualisierungstool nicht registriert war

replaceVisualisationTool

public boolean replaceVisualisationTool(Class toolOld,
                                        Class toolNew)
Ersetzt die Registrierung eines Visualisierungstools durch ein andere.

Parameters:
toolOld - zu ersetzendes Visualisierungstool
toolNew - neues Visualisierungstool
Returns:
false falls toolOld nicht registriert war und deshalb keine Ersetzung moeglich ist

isVisualisationToolRegistered

public boolean isVisualisationToolRegistered(Class toolClass)
Prueft, ob eine Visualisierungstool registriert ist.


getVisualisationTools

public Class[] getVisualisationTools()
Liefert alle registrierten Visualisierungstools.


registerModelClass

public boolean registerModelClass(Class modelClass)
Registriert eine Modellklasse.

Parameters:
modelClass - Modellklasse
Returns:
false falls die Modellklasse bereits registriert ist

unregisterModelClass

public boolean unregisterModelClass(Class modelClass)
Entfernt die Registrierung einer Modellklasse.

Parameters:
modelClass - Modellklasse
Returns:
false falls die Modellklasse nicht registriert war

replaceModelClass

public boolean replaceModelClass(Class modelOld,
                                 Class modelNew)
Ersetzt die Registrierung einer Modellklasse durch eine andere.

Parameters:
modelOld - zu ersetzende Modellklasse
modelNew - neue Modellklasse
Returns:
false falls modelOld nicht registriert war und deshalb keine Ersetzung moeglich ist

isModelClassRegistered

public boolean isModelClassRegistered(Class modelClass)
Prueft, ob eine Modellklasse registriert ist.


getModelClasses

public Class[] getModelClasses()
Liefert alle registrierten Modellkassen.


registerScriptInterpreter

public boolean registerScriptInterpreter(ScriptInterpreter interpreter)
Registriert einen Skript-Interpreters.

Parameters:
interpreter - ScriptInterpreter-Instanz
Returns:
false falls die Klasse bereits registriert ist

unregisterScriptInterpreter

public boolean unregisterScriptInterpreter(ScriptInterpreter interpreter)
Entfernt die Registrierung eines Skript-Interpreters.

Parameters:
interpreter - ScriptInterpreter-Instanz
Returns:
false falls die Klasse nicht registriert war

replaceScriptInterpreter

public boolean replaceScriptInterpreter(ScriptInterpreter interpreterOld,
                                        ScriptInterpreter interpreterNew)
Ersetzt die Registrierung einer Skript-Interpreters durch einen andere.

Parameters:
interpreterOld - zu ersetzender Skript-Interpreter
interpreterNew - neuer Skript-Interpreter
Returns:
false falls interpreterOld nicht registriert war und deshalb keine Ersetzung moeglich ist

isScriptInterpreterRegistered

public boolean isScriptInterpreterRegistered(ScriptInterpreter interpreter)
Prueft, ob ein Skript-Interpreter registriert ist.


getScriptInterpreter

public ScriptInterpreter[] getScriptInterpreter()
Liefert alle registrierten Skript-Interpreter.


getScriptInterpreter

public ScriptInterpreter[] getScriptInterpreter(String name)
Liefert alle Skript-Interpreter, die einen bestimmten Namen besitzen.

Parameters:
name - Bezeichnung des Skript-Interpreter
Returns:
ein leerer Skript-Interpreter-Array, falls zu der Bezeichnung kein Skript-Interpreter registriert ist

registerPlugin

public boolean registerPlugin(XuluPlugin plugin)
Registriert ein Xulu-Plugin.

Parameters:
plugin - XuluPlugin-Instanz
Returns:
false falls die Klasse bereits registriert ist

unregisterPlugin

public boolean unregisterPlugin(XuluPlugin plugin)
Entfernt die Registrierung eines Xulu-Plugins. Wenn das Plugin auch als Autostart-Plugin registriert war, wird dieses ebenfalls entfernt.

Parameters:
plugin - XuluPlugin-Instanz
Returns:
false falls die Klasse nicht registriert war

replacePlugin

public boolean replacePlugin(XuluPlugin pluginOld,
                             XuluPlugin pluginNew)
Ersetzt die Registrierung eines Xulu-Plugins durch eine andere. Wenn das Plugin auch als Autostart-Plugin registriert war, wird dieses ebenfalls ersetzt.

Parameters:
pluginOld - zu ersetzendes Plugin
pluginNew - neues Plugin
Returns:
false falls pluginOld nicht registriert war und deshalb keine Ersetzung moeglich ist

isPluginRegistered

public boolean isPluginRegistered(XuluPlugin plugin)
Prueft, ob ein Plugin registriert ist.


getPlugins

public XuluPlugin[] getPlugins()
Liefert alle registrierten Xulu-Plugins.


registerAutostartPlugin

public boolean registerAutostartPlugin(XuluPlugin plugin)
Registriert ein Xulu-Plugin als Autostart-Plugin. Wenn noch nicht registriert, wird es (automatisch) auch in die Liste der Xulu-Plugins aufgenommen.

Parameters:
plugin - XuluPlugin-Instanz
Returns:
false falls das Plugin bereits registriert ist

unregisterAutostartPlugin

public boolean unregisterAutostartPlugin(XuluPlugin plugin)
Entfernt die Registrierung eines Xulu-Plugins als Autostart-Plugin. Als "normalen" Plugin bleibt es jedoch registriert.

Parameters:
plugin - XuluPlugin-Instanz
Returns:
false falls die Klasse nicht registriert war

replaceAutostartPlugin

public boolean replaceAutostartPlugin(XuluPlugin pluginOld,
                                      XuluPlugin pluginNew)
Ersetzt die Registrierung eines Xulu-Plugins als Autostart-Plugin durch eine andere.

Parameters:
pluginOld - zu ersetzendes Plugin
pluginNew - neues Plugin
Returns:
false falls pluginOld nicht registriert war und deshalb keine Ersetzung moeglich ist

isAutostartPluginRegistered

public boolean isAutostartPluginRegistered(XuluPlugin plugin)
Prueft, ob ein Plugin als Autostart-Plugin registriert ist.


getAutostartPlugins

public XuluPlugin[] getAutostartPlugins()
Liefert alle registrierten Autostart-Plugins.


getRecentImports

public RecentImports getRecentImports()
Liefert eine Liste, in der die letzten Daten-Importe hinterlegt werden.


getRecentScripts

public RecentScripts getRecentScripts()
Liefert eine Liste, in der die letzten Script-Aufrufe hinterlegt werden.