alvinalexander.com | career | drupal | java | mac | mysql | perl | scala | uml | unix  

What this is

This file is included in the DevDaily.com "Java Source Code Warehouse" project. The intent of this project is to help you "Learn Java by Example" TM.

Other links

The source code

/*
 *                 Sun Public License Notice
 *
 * The contents of this file are subject to the Sun Public License
 * Version 1.0 (the "License"). You may not use this file except in
 * compliance with the License. A copy of the License is available at
 * http://www.sun.com/
 *
 * The Original Code is NetBeans. The Initial Developer of the Original
 * Code is Sun Microsystems, Inc. Portions Copyright 1997-2003 Sun
 * Microsystems, Inc. All Rights Reserved.
 */
package org.netbeans.modules.registry.mergedctx;

import org.netbeans.api.registry.*;
import org.netbeans.spi.registry.BasicContext;
import org.netbeans.spi.registry.MergedContextProvider;
import org.netbeans.spi.registry.SpiUtils;
import org.openide.util.Mutex;
import org.openide.util.WeakListeners;

import java.beans.PropertyChangeEvent;
import java.beans.PropertyChangeListener;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Iterator;
import java.util.List;

public final class RootContextImpl extends BasicContextImpl {
    private final Mutex.Privileged privilegedMutex = new Mutex.Privileged();
    private final Mutex mutex = new Mutex(privilegedMutex);

    private final MergedContextProvider provider;
    private final Cache cache = new Cache();

    private final MergeCtxProviderListener mergeCtxProviderListener = new MergeCtxProviderListener();;
    private ContextListenerImpl[] listeners;


    public static final BasicContext create(final MergedContextProvider provider) {
        return new RootContextImpl(provider);
    }

    private RootContextImpl(final MergedContextProvider provider) {
        super();
        this.provider = provider;
        setContextDelegates(provider);
        getCache().cacheContext(this);
        this.provider.addPropertyChangeListener(
                (PropertyChangeListener) WeakListeners.create(PropertyChangeListener.class, mergeCtxProviderListener, this.provider));
    }

    private void setContextDelegates(final MergedContextProvider provider) {
        final MergedDelegates rootCtxDelegates = MergedDelegates.createRoot(provider.getDelegates(), RootContextImpl.this);
        if (rootCtxDelegates != null) rootCtxDelegates.init();
        if (getContextDelegates() == null && rootCtxDelegates == null) return;
        removeListeners();
        super.setContextDelegates(rootCtxDelegates);
        addListeners();

        for (Iterator iterator = getCache().existingSubcontexts(this).iterator(); iterator.hasNext();) {
            final BasicContextImpl context = (BasicContextImpl) iterator.next();
            if (context == this) continue;
            final MergedDelegates newDelegate = MergedDelegates.createChild(rootCtxDelegates, context.getAbsolutePath());
            if (newDelegate != null) {
                context.setContextDelegates(newDelegate);
            } else {
                getCache().removeContext(context.getAbsolutePath());
            }
        }
    }

    void setContextDelegates(final MergedDelegates contextDelegates) {
    }

    private synchronized void removeListeners() {
        if (getContextDelegates() != null) {
            final BasicContext[] oldDelegates = getContextDelegates().getDelegates();
            if (listeners != null && listeners.length == oldDelegates.length) {
                for (int i = 0; i < oldDelegates.length; i++) {
                    final BasicContext basicContext = oldDelegates[i];
                    if (basicContext != null && listeners[i] != null) {
                        basicContext.removeContextListener(listeners[i]);
                    }
                }
            }
        }
        listeners = null;
    }

    private synchronized void addListeners() {
        final BasicContext[] newDelegates = getContextDelegates().getDelegates();
        if (listeners == null) {
            final List list = new ArrayList();
            for (int layoutIndex = 0; layoutIndex < newDelegates.length; layoutIndex++) {
                if (newDelegates[layoutIndex] != null) {
                    final String absoluteName = SpiUtils.createContext(newDelegates[layoutIndex]).getAbsoluteContextName();
                    final ContextListenerImpl l = new ContextListenerImpl(absoluteName);
                    newDelegates[layoutIndex].addContextListener(
                            (ContextListener) WeakListeners.create(ContextListener.class, l, newDelegates[layoutIndex]));
                    list.add(l);
                }
            }

            listeners = (ContextListenerImpl[]) list.toArray(new ContextListenerImpl[list.size()]);
        }
    }

    public ObjectRef findObject(final Object object) {
        return cache.getObjectRef(object);
    }

    public void flush() {
    }

    public Mutex.Privileged getMutex() {
        return privilegedMutex;
    }

    final protected Cache getCache() {
        return cache;
    }

    private final class MergeCtxProviderListener implements PropertyChangeListener {
        public final void propertyChange(final PropertyChangeEvent evt) {
            setContextDelegates(provider);
        }
    }


    private final class ContextListenerImpl implements ContextListener {
        private final String absoluteName;

        private ContextListenerImpl(final String absoluteName) {
            this.absoluteName = absoluteName;
        }


        public final void subcontextChanged(final SubcontextEvent evt) {
            /*Mask is ever followed by deleted context on active delegate*/
            if (MaskUtils.isMaskForCtxName(evt.getSubcontextName())) {
                return;
            }

            final Resource contextPath;
            contextPath = new Resource(evt.getContext().getAbsoluteContextName().substring(absoluteName.length()));
            final BasicContextImpl mergedSource = getCache().getContext(contextPath);
            final BasicContextImpl mergedSubcontext = getCache().getContext(contextPath.getChild(evt.getSubcontextName()));

            if (mergedSubcontext != null) {
                updateContext(mergedSource, mergedSubcontext, evt);
            }

            if (mergedSource != null) {
                if (!mergedSource.isInvalid()) {
                    if (mergedSubcontext != null && !mergedSubcontext.isInvalid()) {
                        final int layout = Arrays.asList(listeners).indexOf(this);
                        mergedSubcontext.getContextDelegates().refreshBindingNames(mergedSubcontext.getDispatcher(), null, layout);
                        mergedSubcontext.getContextDelegates().refreshAttributeNames(mergedSubcontext.getDispatcher(), null, layout);
                    }
                    mergedSource.getContextDelegates().refreshSubcontextNames(mergedSource.getDispatcher());
                }
            }
        }

        private void updateContext(final BasicContextImpl mergedSource, final BasicContextImpl mergedSubcontext, final SubcontextEvent evt) {
            BasicContextImpl parent = mergedSource;
            parent = (parent == null) ? (BasicContextImpl) mergedSubcontext.getParentContext() : parent;
            if (parent != null) {
                final MergedDelegates updatedContext = parent.getContextDelegates().createChild(evt.getSubcontextName());
                if (updatedContext != null) {
                    mergedSubcontext.setContextDelegates(updatedContext);
                } else {
                    getCache().removeContext(mergedSubcontext.getAbsolutePath());
                }
            }
        }

        public final void bindingChanged(final BindingEvent evt) {
            if (MaskUtils.isMaskForBindingName(evt.getBindingName())) {
                return;
            }

            final Resource contextPath;
            contextPath = new Resource(evt.getContext().getAbsoluteContextName().substring(absoluteName.length()));
            final BasicContextImpl mergedSource = getCache().getContext(contextPath);

            if (mergedSource != null) {
                if (!mergedSource.isInvalid()) {
                    final int layout = Arrays.asList(listeners).indexOf(this);
                    mergedSource.getContextDelegates().refreshBindingNames(mergedSource.getDispatcher(), evt, layout);//initBindingNames();
                }
            }
        }

        public final void attributeChanged(final AttributeEvent evt) {
            if (MaskUtils.isMaskForAttributeName(evt.getAttributeName())) return;

            final Resource contextPath;
            contextPath = new Resource(evt.getContext().getAbsoluteContextName().substring(absoluteName.length()));
            final BasicContextImpl mergedSource = getCache().getContext(contextPath);


            if (mergedSource != null) {
                if (!mergedSource.isInvalid()) {
                    mergedSource.getContextDelegates().refreshAttributeNames(mergedSource.getDispatcher(), evt, Arrays.asList(listeners).indexOf(this));
                }
            }
        }
    }


}
... this post is sponsored by my books ...

#1 New Release!

FP Best Seller

 

new blog posts

 

Copyright 1998-2021 Alvin Alexander, alvinalexander.com
All Rights Reserved.

A percentage of advertising revenue from
pages under the /java/jwarehouse URI on this website is
paid back to open source projects.