/*******************************************************************************
* Copyright (c) 2014, 2015 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.locator.utils;
import java.io.IOException;
import java.net.ServerSocket;
import java.util.HashMap;
import java.util.Map;
import java.util.concurrent.atomic.AtomicBoolean;
import java.util.concurrent.atomic.AtomicReference;
import org.eclipse.tcf.protocol.IPeer;
import org.eclipse.tcf.protocol.Protocol;
import org.eclipse.tcf.te.runtime.interfaces.properties.IPropertiesContainer;
import org.eclipse.tcf.te.tcf.core.interfaces.IPeerProperties;
import org.eclipse.tcf.te.tcf.locator.interfaces.nodes.IPeerNode;
import org.eclipse.tcf.te.tcf.locator.interfaces.nodes.IPeerNodeProperties;
/**
* Common utils
*/
public final class CommonUtils {
public static String getType(IPeerNode peerNode) {
if (peerNode != null) {
return peerNode.getPeerType();
}
return null;
}
public static String getType(IPeer peer) {
if (peer != null) {
return peer.getAttributes().get(IPeerProperties.PROP_TYPE);
}
return null;
}
public static String getType(IPropertiesContainer props) {
return props != null ? props.getStringProperty(IPeerProperties.PROP_TYPE) : null;
}
public static String getSubType(IPeerNode peerNode) {
IPeer peer = peerNode.getPeer();
return getSubType(peer);
}
public static String getSubType(IPeer peer) {
Map<String, String> attrs = peer.getAttributes();
String subType = attrs.get(IPeerProperties.PROP_SUBTYPE);
if (subType == null) {
subType = IPeerProperties.SUBTYPE_REAL;
}
return subType;
}
public static String getSubType(IPropertiesContainer props) {
String subType = props.getStringProperty(IPeerProperties.PROP_SUBTYPE);
if (subType == null) {
subType = IPeerProperties.SUBTYPE_REAL;
}
return subType;
}
public static String getMode(IPeerNode peerNode) {
IPeer peer = peerNode.getPeer();
return getMode(peer);
}
public static String getMode(IPeer peer) {
Map<String, String> attrs = peer.getAttributes();
String mode = attrs.get(IPeerProperties.PROP_MODE);
if (mode == null) {
mode = IPeerProperties.MODE_RUN;
}
return mode;
}
public static String getMode(IPropertiesContainer props) {
String mode = props.getStringProperty(IPeerProperties.PROP_MODE);
if (mode == null) {
mode = IPeerProperties.MODE_RUN;
}
return mode;
}
/**
* Get a free local port.
* @return The port or -1 on any errors.
*/
public static int getFreePort() {
int port = -1;
try {
ServerSocket socket = new ServerSocket(0);
port = socket.getLocalPort();
socket.close();
} catch (IOException e) { /* ignored on purpose */ }
return port;
}
public static boolean setPeerError(final IPeerNode peerNode, final String error) {
final AtomicBoolean changed = new AtomicBoolean();
Protocol.invokeAndWait(new Runnable() {
@Override
public void run() {
changed.set(peerNode.setProperty(IPeerNodeProperties.PROPERTY_ERROR, error));
}
});
return changed.get();
}
public static String getPeerError(final IPeerNode peerNode) {
final AtomicReference<String> error = new AtomicReference<String>();
Protocol.invokeAndWait(new Runnable() {
@Override
public void run() {
error.set(peerNode.getStringProperty(IPeerNodeProperties.PROPERTY_ERROR));
}
});
if (error.get() != null && error.get().trim().length() > 0) {
return error.get();
}
return null;
}
@SuppressWarnings("unchecked")
public static Map<String,String> getPeerWarnings(final IPeerNode peerNode) {
final AtomicReference<Object> warnings = new AtomicReference<Object>();
Protocol.invokeAndWait(new Runnable() {
@Override
public void run() {
warnings.set(peerNode.getProperty(IPeerNodeProperties.PROPERTY_WARNINGS));
}
});
if (warnings.get() != null && warnings.get() instanceof Map<?,?>) {
return (Map<String,String>)warnings.get();
}
return null;
}
public static boolean setPeerWarning(final IPeerNode peerNode, final String key, final String value) {
final AtomicBoolean changed = new AtomicBoolean();
Protocol.invokeAndWait(new Runnable() {
@Override
public void run() {
@SuppressWarnings("unchecked")
Map<String,String> warnings = (Map<String,String>)peerNode.getProperty(IPeerNodeProperties.PROPERTY_WARNINGS);
if (warnings == null) {
if (value == null) {
return;
}
warnings = new HashMap<String,String>();
}
if (value != null) {
changed.set(!value.equals(warnings.get(key)));
warnings.put(key, value);
}
else {
changed.set(warnings.get(key) != null);
warnings.remove(key);
if (warnings.isEmpty()) {
warnings = null;
}
}
peerNode.setChangeEventsEnabled(false);
peerNode.setProperty(IPeerNodeProperties.PROPERTY_WARNINGS, warnings);
peerNode.setChangeEventsEnabled(true);
}
});
peerNode.fireChangeEvent(IPeerNodeProperties.PROPERTY_WARNINGS, null, null);
return changed.get();
}
@SuppressWarnings("unchecked")
public static String getPeerWarningOrigin(final IPeerNode peerNode, final String warningKey) {
final AtomicReference<Object> warningOrigins = new AtomicReference<Object>();
Protocol.invokeAndWait(new Runnable() {
@Override
public void run() {
warningOrigins.set(peerNode.getProperty(IPeerNodeProperties.PROPERTY_WARNING_ORIGINS));
}
});
if (warningOrigins.get() != null && warningOrigins.get() instanceof Map<?,?>) {
return ((Map<String,String>)warningOrigins.get()).get(warningKey);
}
return null;
}
public static boolean setPeerWarningOrigin(final IPeerNode peerNode, final String warningKey, final String value) {
final AtomicBoolean changed = new AtomicBoolean();
Protocol.invokeAndWait(new Runnable() {
@Override
public void run() {
@SuppressWarnings("unchecked")
Map<String,String> warningsOrigins = (Map<String,String>)peerNode.getProperty(IPeerNodeProperties.PROPERTY_WARNING_ORIGINS);
if (warningsOrigins == null) {
if (value == null) {
return;
}
warningsOrigins = new HashMap<String,String>();
}
if (value != null) {
changed.set(!value.equals(warningsOrigins.get(warningKey)));
warningsOrigins.put(warningKey, value);
}
else {
changed.set(warningsOrigins.get(warningKey) != null);
warningsOrigins.remove(warningKey);
if (warningsOrigins.isEmpty()) {
warningsOrigins = null;
}
}
peerNode.setChangeEventsEnabled(false);
peerNode.setProperty(IPeerNodeProperties.PROPERTY_WARNING_ORIGINS, warningsOrigins);
peerNode.setChangeEventsEnabled(true);
}
});
peerNode.fireChangeEvent(IPeerNodeProperties.PROPERTY_WARNING_ORIGINS, null, null);
return changed.get();
}
}