/*******************************************************************************
* Copyright (c) 2011, 2014 Wind River Systems, Inc. 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:
* Wind River Systems - initial API and implementation
*******************************************************************************/
package org.eclipse.tcf.te.tcf.ui.navigator;
import java.util.HashMap;
import java.util.Map;
import java.util.concurrent.atomic.AtomicInteger;
import org.eclipse.core.runtime.Assert;
import org.eclipse.jface.viewers.ILabelDecorator;
import org.eclipse.jface.viewers.LabelProvider;
import org.eclipse.swt.graphics.Image;
import org.eclipse.tcf.protocol.IPeer;
import org.eclipse.tcf.protocol.Protocol;
import org.eclipse.tcf.te.runtime.model.interfaces.IModelNode;
import org.eclipse.tcf.te.runtime.services.ServiceManager;
import org.eclipse.tcf.te.runtime.services.interfaces.ISimulatorService;
import org.eclipse.tcf.te.runtime.services.interfaces.delegates.ILabelProviderDelegate;
import org.eclipse.tcf.te.runtime.utils.net.IPAddressUtil;
import org.eclipse.tcf.te.tcf.locator.interfaces.nodes.ILocatorNode;
import org.eclipse.tcf.te.tcf.locator.interfaces.nodes.IPeerNode;
import org.eclipse.tcf.te.tcf.locator.interfaces.services.IPeerModelLookupService;
import org.eclipse.tcf.te.tcf.locator.model.ModelManager;
import org.eclipse.tcf.te.tcf.locator.utils.CommonUtils;
import org.eclipse.tcf.te.tcf.ui.activator.UIPlugin;
import org.eclipse.tcf.te.tcf.ui.internal.ImageConsts;
import org.eclipse.tcf.te.tcf.ui.navigator.images.PeerNodeImageDescriptor;
import org.eclipse.tcf.te.tcf.ui.nls.Messages;
import org.eclipse.tcf.te.ui.jface.images.AbstractImageDescriptor;
import org.eclipse.tcf.te.ui.tables.properties.NodePropertiesTableTableNode;
import org.eclipse.ui.navigator.IDescriptionProvider;
/**
* Label provider implementation.
*/
public class PeerLabelProviderDelegate extends LabelProvider implements ILabelDecorator, ILabelProviderDelegate, IDescriptionProvider {
/* (non-Javadoc)
* @see org.eclipse.jface.viewers.LabelProvider#getText(java.lang.Object)
*/
@Override
public String getText(final Object element) {
if (element instanceof IPeerNode || element instanceof IPeer) {
StringBuilder builder = new StringBuilder();
// Copy the peer node and peer attributes
final Map<String, Object> attrs = new HashMap<String, Object>();
Runnable runnable = new Runnable() {
@Override
public void run() {
if (element instanceof IPeerNode) {
attrs.putAll(((IPeerNode)element).getProperties());
attrs.putAll(((IPeerNode)element).getPeer().getAttributes());
}
else if (element instanceof IPeer) {
attrs.putAll(((IPeer)element).getAttributes());
}
}
};
if (Protocol.isDispatchThread()) {
runnable.run();
}
else {
Protocol.invokeAndWait(runnable);
}
// Build up the base label from the peer name
builder.append((String)attrs.get(IPeer.ATTR_NAME));
// If the label is "TCF Agent" or "TCF Proxy", than append IP/dns.name
// (if not localhost) and port to the label
if (isAppendAddressText(builder.toString())) {
String dnsName = (String)attrs.get("dns.name.transient"); //$NON-NLS-1$
String ip = (String)attrs.get(IPeer.ATTR_IP_HOST);
String port = (String)attrs.get(IPeer.ATTR_IP_PORT);
if (ip != null && !"".equals(ip.trim())) { //$NON-NLS-1$
builder.append(" "); //$NON-NLS-1$
if (!IPAddressUtil.getInstance().isLocalHost(ip)) {
builder.append(dnsName != null && !"".equals(dnsName.trim()) ? dnsName.trim() : ip.trim()); //$NON-NLS-1$
}
if (port != null && !"".equals(port.trim()) && !"1534".equals(port.trim())) { //$NON-NLS-1$ //$NON-NLS-2$
builder.append(":"); //$NON-NLS-1$
builder.append(port.trim());
}
}
}
String label = builder.toString();
if (!"".equals(label.trim())) { //$NON-NLS-1$
return label;
}
}
else if (element instanceof ILocatorNode) {
String name = ((ILocatorNode)element).getName();
if (name == null) {
name = ((ILocatorNode)element).getPeer().getID();
}
return name;
}
else if (element instanceof IModelNode) {
return ((IModelNode)element).getName();
}
else if (element instanceof NodePropertiesTableTableNode) {
NodePropertiesTableTableNode node = (NodePropertiesTableTableNode)element;
if ("SimulatorType".equals(node.name)) { //$NON-NLS-1$
ISimulatorService service = ServiceManager.getInstance().getService(node.value, ISimulatorService.class, false);
if (service != null) {
return service.getName();
}
return node.value;
}
String key = "PeerLabelProviderDelegate_NodePropertiesTable_" + node.name.trim() + "_" + node.value.replaceAll("\\.", "_"); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ //$NON-NLS-4$
if (Messages.hasString(key)) {
return Messages.getString(key);
}
}
return null;
}
/* (non-Javadoc)
* @see org.eclipse.ui.navigator.IDescriptionProvider#getDescription(java.lang.Object)
*/
@Override
public String getDescription(Object element) {
if (element instanceof IPeerNode) {
IPeerNode peerNode = (IPeerNode)element;
if (!peerNode.isValid()) {
String error = CommonUtils.getPeerError(peerNode);
if (error != null) {
return error;
}
return Messages.PeerLabelProviderDelegate_description_invalid;
}
Map<String,String> warnings = CommonUtils.getPeerWarnings(peerNode);
if (warnings != null && !warnings.isEmpty()) {
String desc = ""; //$NON-NLS-1$
for (String warning : warnings.values()) {
if (desc.trim().length() > 0) {
desc += "; "; //$NON-NLS-1$
}
desc += warning.replaceAll("\n", "").replaceAll("\t", ""); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ //$NON-NLS-4$
}
return desc;
}
}
return null;
}
/**
* Determines if the IP-address and port needs to be appended
* to the given label.
* <p>
* The default implementation returns <code>true</code> if the label is either
* "TCF Agent" or "TCF Proxy".
*
* @param label The label. Must not be <code>null</code>.
* @return <code>True</code> if the address shall be appended, <code>false</code> otherwise.
*/
protected boolean isAppendAddressText(final String label) {
Assert.isNotNull(label);
boolean append = "TCF Agent".equals(label) || "TCF Proxy".equals(label); //$NON-NLS-1$ //$NON-NLS-2$
if (!append) {
final AtomicInteger count = new AtomicInteger();
Runnable runnable = new Runnable() {
@Override
public void run() {
count.set(ModelManager.getPeerModel().getService(IPeerModelLookupService.class).lkupPeerModelByName(label).length);
}
};
if (Protocol.isDispatchThread()) runnable.run();
else Protocol.invokeAndWait(runnable);
append = count.get() > 1;
}
return append;
}
/* (non-Javadoc)
* @see org.eclipse.jface.viewers.LabelProvider#getImage(java.lang.Object)
*/
@Override
public Image getImage(Object element) {
if (element instanceof IPeerNode) {
return UIPlugin.getImage(ImageConsts.CONNECTION);
}
if (element instanceof ILocatorNode) {
if (((ILocatorNode)element).isDiscovered()) {
return UIPlugin.getImage(ImageConsts.PEER_DISCOVERED);
}
return UIPlugin.getImage(ImageConsts.PEER_STATIC);
}
else if (element instanceof IModelNode) {
return UIPlugin.getImage(((IModelNode)element).getImageId());
}
return super.getImage(element);
}
/* (non-Javadoc)
* @see org.eclipse.jface.viewers.ILabelDecorator#decorateImage(org.eclipse.swt.graphics.Image, java.lang.Object)
*/
@Override
public Image decorateImage(Image image, Object element) {
Image decoratedImage = image;
if (image != null && element instanceof IPeerNode) {
AbstractImageDescriptor descriptor = new PeerNodeImageDescriptor(
UIPlugin.getDefault().getImageRegistry(),
image,
(IPeerNode)element);
decoratedImage = UIPlugin.getSharedImage(descriptor);
}
return decoratedImage;
}
/* (non-Javadoc)
* @see org.eclipse.jface.viewers.ILabelDecorator#decorateText(java.lang.String, java.lang.Object)
*/
@Override
public String decorateText(String text, Object element) {
if (element instanceof ILocatorNode) {
String ip = ((ILocatorNode)element).getPeer().getAttributes().get(IPeer.ATTR_IP_HOST);
String port = ((ILocatorNode)element).getPeer().getAttributes().get(IPeer.ATTR_IP_PORT);
if (port == null || port.trim().equals("1534")) { //$NON-NLS-1$
port = ""; //$NON-NLS-1$
}
else {
port = ":" + port.trim(); //$NON-NLS-1$
}
if (text != null && ip != null && !text.contains(ip)) {
text += " (" + ip + port + ")"; //$NON-NLS-1$ //$NON-NLS-2$
return text;
}
}
return null;
}
}