/******************************************************************************* * Copyright (c) 2012 AGETO Service GmbH 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: * Gunnar Wagenknecht - initial API and implementation *******************************************************************************/ package org.eclipse.gyrex.admin.ui.internal.pages.overview; import java.lang.reflect.Method; import java.net.InetAddress; import org.eclipse.gyrex.admin.ui.internal.AdminUiActivator; import org.eclipse.gyrex.admin.ui.internal.application.AdminUiUtil; import org.eclipse.gyrex.admin.ui.internal.helper.SwtUtil; import org.eclipse.gyrex.admin.ui.internal.pages.OverviewPageItem; import org.eclipse.gyrex.admin.ui.internal.widgets.NonBlockingMessageDialogs; import org.eclipse.gyrex.boot.internal.app.ServerApplication; import org.eclipse.jface.window.Window; import org.eclipse.rap.rwt.widgets.DialogCallback; import org.eclipse.swt.SWT; import org.eclipse.swt.events.SelectionAdapter; import org.eclipse.swt.events.SelectionEvent; import org.eclipse.swt.widgets.Composite; import org.eclipse.swt.widgets.Control; import org.eclipse.swt.widgets.Label; import org.eclipse.swt.widgets.Link; import org.osgi.framework.BundleContext; import org.osgi.framework.ServiceReference; import org.apache.commons.lang.exception.ExceptionUtils; public class NodeShortcuts extends OverviewPageItem { @Override public Control createControl(final Composite parent) { final Composite composite = new Composite(parent, SWT.NULL); composite.setLayout(AdminUiUtil.createGridLayoutWithoutMargin(1, true)); composite.setLayoutData(AdminUiUtil.createHorzFillData()); AdminUiUtil.createHeading(composite, "Shortcuts", 1); final Label desc = new Label(composite, SWT.WRAP); desc.setText("Some convenience shortcuts for the system."); desc.setLayoutData(AdminUiUtil.createHorzFillData()); final Link restartLink = new Link(composite, SWT.NONE); restartLink.setText("<a>Restart local node</a>"); restartLink.setLayoutData(AdminUiUtil.createHorzFillData()); restartLink.addSelectionListener(new SelectionAdapter() { /** serialVersionUID */ private static final long serialVersionUID = 1L; @Override public void widgetSelected(final SelectionEvent e) { NonBlockingMessageDialogs.openConfirm(SwtUtil.getShell(restartLink), "Restart Node", String.format("Node %s will be restarted. Please confirm!", getNodeId()), new DialogCallback() { /** serialVersionUID */ private static final long serialVersionUID = 1L; @Override public void dialogClosed(final int returnCode) { if (returnCode == Window.OK) { ServerApplication.restart(); } } }); } }); return composite; } String getNodeId() { try { // we use reflection to not depend on the cloud API at all. final BundleContext bundleContext = AdminUiActivator.getInstance().getBundle().getBundleContext(); final ServiceReference<?> serviceReference = bundleContext.getServiceReference("org.eclipse.gyrex.cloud.environment.INodeEnvironment"); final Object service = bundleContext.getService(serviceReference); if (service != null) { try { final Method method = service.getClass().getMethod("getNodeId"); return (String) method.invoke(service); } finally { bundleContext.ungetService(serviceReference); } } return String.format("running on host %s", InetAddress.getLocalHost().getHostName()); } catch (final Exception e) { return String.format("(%s)", ExceptionUtils.getRootCauseMessage(e)); } } }