package io.scalecube.services;
import static com.google.common.base.Preconditions.checkNotNull;
import com.google.common.base.Splitter;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
/**
* Helper class used to register service with tags as metadata in the scalecube cluster. parsing from service info to
* json and back.
*/
public class ServiceInfo {
private static final String EQ = "=";
private static final String KEY_VALUE_SEPERATOR = ":eq:";
private static final String TAG_SEPERATOR = "|tag|";
private static final String TAGS_SPERATOR = ":tags:";
private String serviceName;
private Map<String, String> tags;
public ServiceInfo(String serviceName, Map<String, String> tags) {
this.serviceName = serviceName;
this.tags = tags;
}
public Map<String, String> getTags() {
return tags;
}
public String getServiceName() {
return serviceName;
}
/**
* Gets a service info instance by a given metadata string SERVICE_NAME:tags:key1=value1|tag|key2=value2|tag|.
*
* @param metadata string as follow : SERVICE_NAME:tags:key1=value1|tag|key2=value2|tag|.
* @return initialized service info.
*/
public static ServiceInfo from(String metadata) {
checkNotNull(metadata);
int index = metadata.indexOf(TAGS_SPERATOR, 0);
String name = metadata.substring(0, index);
String tagsAsString = metadata.substring(index + TAGS_SPERATOR.length());
List<String> list = Splitter.on(TAG_SEPERATOR).splitToList(tagsAsString);
Map<String, String> tags = new HashMap<>();
for (String element : list) {
if (element.length() > 0) {
List<String> kv = Splitter.on(EQ).splitToList(element);
tags.put(kv.get(0).replaceAll(KEY_VALUE_SEPERATOR, EQ), kv.get(1).replaceAll(KEY_VALUE_SEPERATOR, EQ));
}
}
return new ServiceInfo(name, tags);
}
/**
* returns a service info as metadata string: SERVICE_NAME:tags:key1=value1|tag|key2=value2|tag|.
*
* @return initialized service info - SERVICE_NAME:tags:key1=value1|tag|key2=value2|tag|..
*/
public String toMetadata() {
StringBuilder sb = new StringBuilder(serviceName);
sb.append(TAGS_SPERATOR);
tags.entrySet().stream().forEach(kv -> {
sb.append(kv.getKey().replaceAll(EQ, KEY_VALUE_SEPERATOR));
sb.append(EQ);
sb.append(kv.getValue().replaceAll(EQ, KEY_VALUE_SEPERATOR));
sb.append(TAG_SEPERATOR);
});
return sb.toString();
}
}