public function merge(ContextNode $contextNode)
    {

        // merge the application type
        if ($type = $contextNode->getType()) {
            $this->setType($type);
        }

        // merge the application factory class name
        if ($factory = $contextNode->getFactory()) {
            $this->setFactory($factory);
        }

        // merge the application webapp path
        if ($webappPath = $contextNode->getWebappPath()) {
            $this->setWebappPath($webappPath);
        }

        // load the params defined in this context
        $localParams = $this->getParams();

        // merge them with the passed ones
        foreach ($contextNode->getParams() as $paramToMerge) {
            $isMerged = false;
            /** @var \AppserverIo\Appserver\Core\Api\Node\ParamNode $param */
            foreach ($localParams as $key => $param) {
                if ($param->getName() == $paramToMerge->getName()) {
                    $localParams[$key] = $paramToMerge;
                    $isMerged = true;
                }
            }
            if ($isMerged === false) {
                $localParams[$paramToMerge->getUuid()] = $paramToMerge;
            }
        }

        // set the params back to the context
        $this->setParams($localParams);

        // load the annotation registries defined of this context
        $localAnnotationRegistries = $this->getAnnotationRegistries();

        // append the annotation registries
        /**  @var \AppserverIo\Description\Api\Node\AnnotationRegistryNode $additionalAnnotationRegistry */
        foreach ($contextNode->getAnnotationRegistries() as $additionalAnnotationRegistry) {
            $localAnnotationRegistries[] = $additionalAnnotationRegistry;
        }

        // set the annotation registries back to the context
        $this->setAnnotationRegistries($localAnnotationRegistries);

        // load the managers defined of this context
        $localManagers = $this->getManagers();

        // merge them with the passed ones
        /**  @var \AppserverIo\Appserver\Core\Api\Node\ManagerNode $managerToMerge */
        foreach ($contextNode->getManagers() as $managerToMerge) {
            $isMerged = false;
            /** @var \AppserverIo\Appserver\Core\Api\Node\ManagerNode $manager */
            foreach ($localManagers as $key => $manager) {
                if ($manager->getName() === $managerToMerge->getName()) {
                    $manager->merge($managerToMerge);
                    $localManagers[$key] = $manager;
                    $isMerged = true;
                }
            }
            if ($isMerged === false) {
                $localManagers[$managerToMerge->getUuid()] = $managerToMerge;
            }
        }

        // set the managers back to the context
        $this->setManagers($localManagers);

        // load the class loaders of this context
        $localClassLoaders = $this->getClassLoaders();

        // merge them with the passed ones
        /** @var \AppserverIo\Appserver\Core\Api\Node\ClassLoaderNode $classLoaderToMerge */
        foreach ($contextNode->getClassLoaders() as $classLoaderToMerge) {
            $isMerged = false;
            /** @var \AppserverIo\Appserver\Core\Api\Node\ClassLoaderNode $classLoader */
            foreach ($localClassLoaders as $key => $classLoader) {
                if ($classLoader->getName() === $classLoaderToMerge->getName()) {
                    $localClassLoaders[$key] = $classLoaderToMerge;
                    $isMerged = true;
                }
            }
            if ($isMerged === false) {
                $localClassLoaders[$classLoaderToMerge->getUuid()] = $classLoaderToMerge;
            }
        }

        // set the class loaders back to the context
        $this->setClassLoaders($localClassLoaders);

        // load the loggers of this context
        $localLoggers = $this->getLoggers();

        // merge them with the passed ones (DO override already registered loggers)
        /** @var \AppserverIo\Appserver\Core\Api\Node\LoggerNode $loggerToMerge */
        foreach ($contextNode->getLoggers() as $loggerToMerge) {
            $localLoggers[$loggerToMerge->getName()] = $loggerToMerge;
        }

        // set the loggers back to the context
        $this->setLoggers($localLoggers);
    }