blob: ba8a81c562a4b4faf43817c7cf4ed6e18921b4db [file] [log] [blame]
/*
* Copyright (c) 2012, 2013, 2015 Eike Stepper (Berlin, Germany) 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:
* Eike Stepper - initial API and implementation
* Christian W. Damus (CEA LIST) - bug 418454
*/
package org.eclipse.emf.cdo.ui.internal.admin;
import org.eclipse.emf.cdo.admin.CDOAdminClient;
import org.eclipse.emf.cdo.admin.CDOAdminClientManager;
import org.eclipse.emf.cdo.admin.CDOAdminClientRepository;
import org.eclipse.emf.cdo.common.admin.CDOAdminRepository;
import org.eclipse.emf.cdo.common.model.CDOPackageRegistryPopulator;
import org.eclipse.emf.cdo.net4j.CDONet4jSession;
import org.eclipse.emf.cdo.net4j.CDONet4jSessionConfiguration;
import org.eclipse.emf.cdo.ui.internal.admin.actions.AdminAction;
import org.eclipse.emf.cdo.ui.internal.admin.actions.CreateRepositoryAction;
import org.eclipse.emf.cdo.ui.internal.admin.actions.DeleteRepositoryAction;
import org.eclipse.emf.cdo.ui.internal.admin.bundle.OM;
import org.eclipse.emf.cdo.ui.internal.admin.messages.Messages;
import org.eclipse.emf.cdo.ui.shared.SharedIcons;
import org.eclipse.emf.internal.cdo.session.CDOSessionFactory;
import org.eclipse.net4j.ui.Net4jItemProvider.RemoveAction;
import org.eclipse.net4j.util.container.IContainer;
import org.eclipse.net4j.util.container.IManagedContainer;
import org.eclipse.net4j.util.security.CredentialsProviderFactory;
import org.eclipse.net4j.util.security.IPasswordCredentialsProvider;
import org.eclipse.net4j.util.ui.UIUtil;
import org.eclipse.net4j.util.ui.views.ContainerItemProvider;
import org.eclipse.net4j.util.ui.views.ContainerView;
import org.eclipse.core.runtime.IProgressMonitor;
import org.eclipse.jface.action.Action;
import org.eclipse.jface.action.IAction;
import org.eclipse.jface.action.IMenuManager;
import org.eclipse.jface.action.IToolBarManager;
import org.eclipse.jface.dialogs.InputDialog;
import org.eclipse.jface.viewers.ITreeSelection;
import org.eclipse.swt.SWT;
import org.eclipse.swt.graphics.Color;
import org.eclipse.swt.graphics.Font;
import org.eclipse.swt.graphics.Image;
import java.text.MessageFormat;
/**
* @author Eike Stepper
*/
public class CDOAdminView extends ContainerView
{
public final static String ID = "org.eclipse.emf.cdo.ui.admin.CDOAdminView"; //$NON-NLS-1$
private final CDOAdminClientManager adminManager = OM.getAdminManager();
private Image connectionImage = org.eclipse.net4j.ui.shared.SharedIcons
.getImage(org.eclipse.net4j.ui.shared.SharedIcons.OBJ_CONNECTOR);
private Image repositoryImage = SharedIcons.getImage(SharedIcons.OBJ_REPO);
private IAction addConnectionAction;
private static int lastSessionNumber;
public CDOAdminView()
{
}
@Override
protected IContainer<?> getContainer()
{
return adminManager;
}
@Override
protected ContainerItemProvider<IContainer<Object>> createContainerItemProvider()
{
return new ContainerItemProvider<IContainer<Object>>()
{
@Override
public String getText(Object obj)
{
if (obj instanceof CDOAdminClient)
{
CDOAdminClient connection = (CDOAdminClient)obj;
return connection.getURL();
}
if (obj instanceof CDOAdminRepository)
{
CDOAdminRepository repository = (CDOAdminRepository)obj;
return MessageFormat.format(Messages.CDOAdminView_0, repository.getName(), repository.getType(),
repository.getState());
}
return super.getText(obj);
}
@Override
public Image getImage(Object obj)
{
if (obj instanceof CDOAdminClient)
{
return connectionImage;
}
if (obj instanceof CDOAdminRepository)
{
return repositoryImage;
}
return super.getImage(obj);
}
@Override
public Font getFont(Object obj)
{
if (isDisabled(obj))
{
return getItalicFont();
}
return super.getFont(obj);
}
@Override
public Color getForeground(Object obj)
{
if (isDisabled(obj))
{
return getDisplay().getSystemColor(SWT.COLOR_GRAY);
}
return super.getForeground(obj);
}
private boolean isDisabled(Object obj)
{
if (obj instanceof CDOAdminClient)
{
CDOAdminClient admin = (CDOAdminClient)obj;
return !admin.isConnected();
}
return false;
}
};
}
@Override
protected void fillContextMenu(IMenuManager manager, ITreeSelection selection)
{
super.fillContextMenu(manager, selection);
if (selection.size() == 1)
{
Object obj = selection.getFirstElement();
if (obj instanceof CDOAdminClient)
{
CDOAdminClient admin = (CDOAdminClient)obj;
manager.add(new CreateRepositoryAction(admin));
manager.add(new RemoveConnectionAction(adminManager, admin));
}
else if (obj instanceof CDOAdminClientRepository)
{
CDOAdminClientRepository repository = (CDOAdminClientRepository)obj;
manager.add(new OpenSessionAction(repository));
manager.add(new DeleteRepositoryAction(repository));
}
}
}
@Override
protected void fillLocalToolBar(IToolBarManager manager)
{
if (addConnectionAction == null)
{
addConnectionAction = new Action()
{
@Override
public void run()
{
String lastURL = OM.getLastURL();
InputDialog dialog = new InputDialog(getShell(), getText(), Messages.CDOAdminView_1, lastURL, null);
if (dialog.open() == InputDialog.OK)
{
String url = dialog.getValue();
OM.setLastURL(url);
adminManager.addConnection(url);
}
}
};
addConnectionAction.setText(Messages.CDOAdminView_2);
addConnectionAction.setToolTipText(Messages.CDOAdminView_3);
addConnectionAction.setImageDescriptor(
org.eclipse.net4j.ui.shared.SharedIcons.getDescriptor(org.eclipse.net4j.ui.shared.SharedIcons.ETOOL_ADD));
}
manager.add(addConnectionAction);
super.fillLocalToolBar(manager);
}
protected IPasswordCredentialsProvider getCredentialsProvider()
{
IManagedContainer container = adminManager.getContainer();
String productGroup = CredentialsProviderFactory.PRODUCT_GROUP;
String factoryType = "interactive"; //$NON-NLS-1$
IPasswordCredentialsProvider credentialsProvider = (IPasswordCredentialsProvider)container.getElement(productGroup,
factoryType, null);
if (credentialsProvider == null)
{
credentialsProvider = UIUtil.createInteractiveCredentialsProvider();
}
return credentialsProvider;
}
public static int getNextSessionNumber()
{
return ++lastSessionNumber;
}
/**
* @author Eike Stepper
*/
public static class RemoveConnectionAction extends RemoveAction
{
private CDOAdminClientManager adminManager;
public RemoveConnectionAction(CDOAdminClientManager adminManager, CDOAdminClient admin)
{
super(admin);
this.adminManager = adminManager;
}
public CDOAdminClientManager getAdminManager()
{
return adminManager;
}
@Override
public CDOAdminClient getObject()
{
return (CDOAdminClient)super.getObject();
}
@Override
protected void doRun(IProgressMonitor progressMonitor) throws Exception
{
adminManager.removeConnection(getObject());
}
}
/**
* @author Eike Stepper
*/
public class OpenSessionAction extends AdminAction<CDOAdminClientRepository>
implements CDOAdminClientRepository.SessionConfigurator
{
public OpenSessionAction(CDOAdminClientRepository repository)
{
super(Messages.CDOAdminView_4, Messages.CDOAdminView_5, SharedIcons.getDescriptor(SharedIcons.ETOOL_OPEN_SESSION),
repository);
}
public CDOAdminClientRepository getRepository()
{
return target;
}
@Override
protected void safeRun(IProgressMonitor progressMonitor) throws Exception
{
CDONet4jSession session = target.openSession(this);
if (session != null)
{
CDOPackageRegistryPopulator.populate(session.getPackageRegistry());
IManagedContainer container = adminManager.getContainer();
String description = "session" + getNextSessionNumber(); //$NON-NLS-1$
container.putElement(CDOSessionFactory.PRODUCT_GROUP, "admin", description, session); //$NON-NLS-1$
}
}
public void prepare(CDONet4jSessionConfiguration configuration)
{
IPasswordCredentialsProvider credentialsProvider = getCredentialsProvider();
configuration.setCredentialsProvider(credentialsProvider);
}
@Override
protected String getErrorPattern()
{
return Messages.CDOAdminView_6;
}
}
}