| /******************************************************************************* |
| * Copyright (c) 2001, 2005 IBM Corporation and others. |
| * All rights reserved. This program and the accompanying materials |
| * are made available under the terms of the Eclipse Public License v1.0 |
| * which accompanies this distribution, and is available at |
| * http://www.eclipse.org/legal/epl-v10.html |
| * |
| * Contributors: |
| * IBM Corporation - initial API and implementation |
| * Jens Lukowski/Innoopract - initial renaming/restructuring |
| * |
| *******************************************************************************/ |
| package org.eclipse.wst.xml.core.internal.propagate; |
| |
| |
| import java.util.ArrayList; |
| import java.util.Iterator; |
| import java.util.List; |
| |
| import org.eclipse.wst.sse.core.internal.PropagatingAdapter; |
| import org.eclipse.wst.sse.core.internal.PropagatingAdapterFactory; |
| import org.eclipse.wst.sse.core.internal.provisional.AbstractAdapterFactory; |
| import org.eclipse.wst.sse.core.internal.provisional.INodeAdapter; |
| import org.eclipse.wst.sse.core.internal.provisional.INodeAdapterFactory; |
| import org.eclipse.wst.sse.core.internal.provisional.INodeNotifier; |
| |
| |
| /** |
| * The PropagatingAdapterFactory is part of the "adapt on create" mechanism. A |
| * PropagatingAdapter, once added to a node, will cause proagating adapters to |
| * be created for all child nodes. A side effect of creating a |
| * PropagatingAdapter for a node is that is is also creates adapters for and |
| * adapts the Node for all other registered 'create on adapt' Adapters. This |
| * other adapters are registered by registering their factories via plugin |
| * extension point. |
| */ |
| public class PropagatingAdapterFactoryImpl extends AbstractAdapterFactory implements PropagatingAdapterFactory { |
| |
| private PropagatingAdapter fAdapterInstance; |
| private List fContributedFactories = null; |
| |
| /** |
| * PropagatingAdapterFactory constructor comment. |
| */ |
| public PropagatingAdapterFactoryImpl() { |
| this(PropagatingAdapter.class, true); |
| } |
| |
| protected PropagatingAdapterFactoryImpl(Object adapterKey, boolean registerAdapters) { // , |
| super(adapterKey, registerAdapters); |
| } |
| |
| public void addContributedFactories(INodeAdapterFactory factory) { |
| if (fContributedFactories != null) { |
| fContributedFactories.add(factory); |
| } |
| |
| } |
| |
| /** |
| * createAdapter method comment. |
| */ |
| protected INodeAdapter createAdapter(INodeNotifier target) { |
| // every notifier get's one of these |
| // (and the same instance of it) |
| return getAdapterInstance(); |
| } |
| |
| /** |
| * Gets the adapterInstance. |
| * |
| * @return Returns a PropagatingAdapter |
| */ |
| private PropagatingAdapter getAdapterInstance() { |
| if (fAdapterInstance == null) { |
| fAdapterInstance = new PropagatingAdapterImpl(); |
| if (fContributedFactories != null) { |
| for (int i = 0; i < fContributedFactories.size(); i++) |
| fAdapterInstance.addAdaptOnCreateFactory((PropagatingAdapterFactory) fContributedFactories.get(i)); |
| } |
| } |
| return fAdapterInstance; |
| } |
| |
| public void release() { |
| // give the adapter instance a chance to release its factories |
| getAdapterInstance().release(); |
| |
| } |
| |
| public void setContributedFactories(ArrayList list) { |
| fContributedFactories = list; |
| |
| } |
| |
| public INodeAdapterFactory copy() { |
| PropagatingAdapterFactory clonedInstance = new PropagatingAdapterFactoryImpl(getAdapterKey(), isShouldRegisterAdapter()); |
| // clone this adapters specific list of adapter factories too |
| if (fContributedFactories != null) { |
| |
| Iterator iterator = fContributedFactories.iterator(); |
| clonedInstance.setContributedFactories(new ArrayList()); |
| while (iterator.hasNext()) { |
| INodeAdapterFactory existingFactory = (INodeAdapterFactory) iterator.next(); |
| clonedInstance.addContributedFactories(existingFactory.copy()); |
| } |
| } |
| return clonedInstance; |
| } |
| |
| |
| |
| } |