/* * Copyright (C) 2006-2016 DLR, Germany * * All rights reserved * * http://www.rcenvironment.de/ */ package de.rcenvironment.core.communication.utils; import java.util.HashMap; import java.util.Map; import java.util.regex.Matcher; import java.util.regex.Pattern; import org.apache.commons.logging.LogFactory; import de.rcenvironment.core.communication.model.NetworkContactPoint; import de.rcenvironment.core.communication.model.impl.NetworkContactPointImpl; import de.rcenvironment.core.utils.common.StringUtils; /** * Utility methods related to {@link NetworkContactPoint}s. * * @author Robert Mischke */ public final class NetworkContactPointUtils { private static final Pattern NCP_DEFINITION_PATTERN = Pattern.compile("^\\s*([\\w\\-]+):([\\w.\\-]+):(\\d+)(?:\\s*\\((.*)\\))?\\s*$"); private static final Pattern ATTRIBUTE_ENTRY_PATTERN = Pattern.compile("^([^=]+)=(.*)$"); private NetworkContactPointUtils() {} /** * Converts the (transport-specific) String representation of a {@link NetworkContactPoint} into its object representation. * * @param contactPointDef the String representation * @return the object representation * @throws IllegalArgumentException if the String is malformed */ public static NetworkContactPoint parseStringRepresentation(String contactPointDef) throws IllegalArgumentException { Matcher m = NCP_DEFINITION_PATTERN.matcher(contactPointDef); if (!m.matches()) { throw new IllegalArgumentException(); } String host = m.group(2); int port = Integer.parseInt(m.group(3)); String transportId = m.group(1); NetworkContactPointImpl ncp = new NetworkContactPointImpl(host, port, transportId); String attributePart = m.group(4); if (attributePart != null) { Map<String, String> newAttributes = parseAttributePart(attributePart); if (!newAttributes.isEmpty()) { ncp.setAttributes(newAttributes); } } return ncp; } private static Map<String, String> parseAttributePart(String attributePart) { Map<String, String> newAttributes = new HashMap<String, String>(); String[] attributeEntries = attributePart.split(","); for (String entry : attributeEntries) { String trimmedEntry = entry.trim(); if (trimmedEntry.isEmpty()) { continue; } Matcher attrMatcher = ATTRIBUTE_ENTRY_PATTERN.matcher(trimmedEntry); if (!attrMatcher.matches()) { LogFactory.getLog(NetworkContactPointUtils.class).warn("Invalid attribute entry: \"" + entry + "\""); continue; } String key = attrMatcher.group(1).trim(); String val = attrMatcher.group(2); if (val != null) { val = val.trim(); } else { val = ""; } newAttributes.put(key, val); } return newAttributes; } /** * Restores the original string representation from a {@link NetworkContactPoint}. * * @param ncp the NCP * @return the string representation */ public static String toDefinitionString(NetworkContactPoint ncp) { String attributesSuffix = ""; Map<String, String> attributes = ncp.getAttributes(); if (attributes.size() != 0) { // note: quick&dirty formatting; improve as necessary attributesSuffix = attributes.toString(); attributesSuffix = "(" + attributesSuffix.substring(1, attributesSuffix.length() - 1) + ")"; } // note: intentionally using %s for the port to avoid locale-based formatting return StringUtils.format("%s:%s:%s%s", ncp.getTransportId(), ncp.getHost(), ncp.getPort(), attributesSuffix); } }