| /***************************************************************************** |
| * Copyright (c) 2013, 2017 CEA LIST. |
| * |
| * All rights reserved. This program and the accompanying materials |
| * are made available under the terms of the Eclipse Public License 2.0 |
| * which accompanies this distribution, and is available at |
| * https://www.eclipse.org/legal/epl-2.0/ |
| * |
| * SPDX-License-Identifier: EPL-2.0 |
| * |
| * Contributors: |
| * CEA LIST - Initial API and implementation |
| *****************************************************************************/ |
| package org.eclipse.papyrus.cdo.core.admin; |
| |
| import java.util.Map; |
| import java.util.concurrent.CopyOnWriteArrayList; |
| |
| import org.eclipse.emf.cdo.admin.CDOAdminClient; |
| import org.eclipse.emf.cdo.common.admin.CDOAdminRepository; |
| import org.eclipse.net4j.util.container.ContainerEventAdapter; |
| import org.eclipse.net4j.util.container.IContainer; |
| import org.eclipse.papyrus.cdo.internal.core.Activator; |
| |
| import com.google.common.collect.Maps; |
| |
| |
| /** |
| * This is the PapyrusRepositoryAdminManager type. Enjoy. |
| */ |
| public class PapyrusRepositoryAdminManager extends ContainerEventAdapter<CDOAdminClient> { |
| |
| private final RepositoryListener repositoryListener = new RepositoryListener(); |
| |
| private final CopyOnWriteArrayList<IPapyrusRepositoryAdminListener> listeners = new CopyOnWriteArrayList<IPapyrusRepositoryAdminListener>(); |
| |
| private final Map<CDOAdminRepository, String> repositories = Maps.newConcurrentMap(); |
| |
| public PapyrusRepositoryAdminManager() { |
| super(true); |
| } |
| |
| public void install(IContainer<? extends CDOAdminClient> container) { |
| container.addListener(this); |
| |
| for (CDOAdminClient next : container.getElements()) { |
| next.addListener(repositoryListener); |
| } |
| } |
| |
| @Override |
| protected void onAdded(IContainer<CDOAdminClient> container, CDOAdminClient element) { |
| element.addListener(repositoryListener); |
| } |
| |
| @Override |
| protected void onRemoved(IContainer<CDOAdminClient> container, CDOAdminClient element) { |
| element.removeListener(repositoryListener); |
| } |
| |
| public void addRepositoryAdminListener(IPapyrusRepositoryAdminListener listener) { |
| listeners.addIfAbsent(listener); |
| } |
| |
| public void removeRepositoryAdminListener(IPapyrusRepositoryAdminListener listener) { |
| listeners.remove(listener); |
| } |
| |
| protected void fireRepositoryAdminEvent(int eventType, String url, String name) { |
| if (!listeners.isEmpty()) { |
| PapyrusRepositoryAdminEvent event = new PapyrusRepositoryAdminEvent(this, eventType, url, name); |
| for (IPapyrusRepositoryAdminListener next : listeners) { |
| try { |
| switch (eventType) { |
| case PapyrusRepositoryAdminEvent.REPOSITORY_ADDED: |
| next.repositoryAdded(event); |
| break; |
| case PapyrusRepositoryAdminEvent.REPOSITORY_REMOVED: |
| next.repositoryRemoved(event); |
| break; |
| } |
| } catch (Exception e) { |
| Activator.log.error("Uncaught exception in repository admin listener.", e); //$NON-NLS-1$ |
| } |
| } |
| } |
| } |
| |
| // |
| // Nested types |
| // |
| |
| private class RepositoryListener extends ContainerEventAdapter<CDOAdminRepository> { |
| |
| @Override |
| protected void onAdded(IContainer<CDOAdminRepository> container, CDOAdminRepository element) { |
| if (container instanceof CDOAdminClient) { |
| CDOAdminClient client = (CDOAdminClient) container; |
| String url = String.format("%s?repositoryName=%s", client.getURL(), element.getName()); //$NON-NLS-1$ |
| repositories.put(element, url); |
| |
| if (client.isConnected()) { |
| // Only notify for repositories added while connected, which ensures that we don't |
| // get a cascade of events on initial connection and discovery of existing repositories |
| fireRepositoryAdminEvent(PapyrusRepositoryAdminEvent.REPOSITORY_ADDED, url, element.getName()); |
| } |
| } |
| } |
| |
| @Override |
| protected void onRemoved(IContainer<CDOAdminRepository> container, CDOAdminRepository element) { |
| if (container instanceof CDOAdminClient) { |
| CDOAdminClient client = (CDOAdminClient) container; |
| String url = repositories.remove(element); |
| |
| if ((url != null) && client.isConnected()) { |
| // Only notify for repositories removed while connected, which ensures that we don't |
| // get a cascade of events on disconnection from the server |
| fireRepositoryAdminEvent(PapyrusRepositoryAdminEvent.REPOSITORY_REMOVED, url, element.getName()); |
| } |
| } |
| } |
| } |
| } |