Skip to content
This repository was archived by the owner on Nov 3, 2022. It is now read-only.

[#640] icon aliases #641

Merged
merged 3 commits into from
Aug 12, 2021
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
21 changes: 8 additions & 13 deletions docs/source/output.rst
Original file line number Diff line number Diff line change
Expand Up @@ -46,19 +46,14 @@ like "account".
- identifier: bar
type: account

The following types are translated icons to maintain backward compatibility:

* CACHE -> "flash-circle"
* CONTAINER -> "inbox"
* FIREWALL -> "wall"
* HUMANUSER -> "account"
* INTERFACE -> "connection"
* KEYVALUESTORE -> "keyvaluestore"
* LOADBALANCER -> "loadbalancer"
* MESSAGEQUEUE -> "tray-full"
* MOBILECLIENT -> "cellphone"
* VOLUME -> "harddisk"
* WEBSERVICE -> "application"
Alternatively you can use any icon name on the icon field.

.. code-block:: yaml
:linenos:

items:
- identifier: bar
icon: flash-circle

Vendor Logos
^^^^^^^^^^^^^
Expand Down
5 changes: 4 additions & 1 deletion src/main/app/copy-icons.js
Original file line number Diff line number Diff line change
@@ -1,7 +1,10 @@
#!/usr/bin/env node
const fs = require('fs-extra');

// Async with promises:
fs.copy('node_modules/@mdi/svg/svg', '../resources/static/icons/svg')
.then(() => console.log('Icons copied successfully!'))
.catch((err) => console.error(err));

fs.copy('node_modules/@mdi/svg/meta.json', '../resources/static/icons/meta.json')
.then(() => console.log('Icon meta.json list copied successfully!'))
.catch((err) => console.error(err));
110 changes: 73 additions & 37 deletions src/main/java/de/bonndan/nivio/output/icons/IconMapping.java
Original file line number Diff line number Diff line change
@@ -1,49 +1,85 @@
package de.bonndan.nivio.output.icons;

import java.util.Arrays;
import java.util.Optional;
import com.fasterxml.jackson.databind.DeserializationFeature;
import com.fasterxml.jackson.databind.ObjectMapper;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.lang.Nullable;

import java.io.IOException;
import java.nio.file.Path;
import java.nio.file.Paths;
import java.util.*;

/**
* Mapping of "known" icons (item.type) to Material Design icons.
*
*
*/
public enum IconMapping {

DEFAULT_ICON("cog"),
BACKEND("application-cog"),
CACHE("flash-circle"),
CONTAINER("inbox"),
DEPLOYMENT("rocket-launch"),
POD("application"),
FIREWALL("wall"),
FRONTEND("television-guide"),
HUMANUSER("account"),
INTERFACE("connection"),
KEYVALUESTORE("view-list"),
LOADBALANCER("call-split"),
MESSAGEQUEUE("tray-full"),
MOBILECLIENT("cellphone"),
REPLICASET("content-copy"),
SERVICE("information-outline"),
SECRET("application-cog"),
STATEFULSET("harddisk-plus"),
VOLUME("harddisk"),
WEBSERVICE("application");

private final String icon;

IconMapping(String icon) {
this.icon = icon;
public class IconMapping {

private static final Logger LOGGER = LoggerFactory.getLogger(IconMapping.class);

public static final String DEFAULT_ICON = "cog";

public static final String BACKEND = "backend";
public static final String CACHE = "cache";
public static final String CONTAINER = "container";
public static final String DEPLOYMENT = "deployment";
public static final String POD = "pod";
public static final String FIREWALL = "firewall";
public static final String FRONTEND = "frontend";
public static final String INTERFACE = "interface";
public static final String KEYVALUESTORE = "keyvaluestore";
public static final String LOADBALANCER = "loadbalancer";
public static final String MESSAGEQUEUE = "messagequeue";
public static final String REPLICASET = "replicaset";
public static final String SECRET = "secret";
public static final String STATEFULSET = "statefulset";
public static final String VOLUME = "volume";

private final Map<String, String> iconsAndAliases = new HashMap<>();

public IconMapping() {
iconsAndAliases.put("webservice", "application");
iconsAndAliases.put(CACHE, "flash-circle");
iconsAndAliases.put(FIREWALL, "wall");
iconsAndAliases.put(VOLUME, "harddisk");
iconsAndAliases.put(BACKEND, "application-cog");
iconsAndAliases.put(SECRET, "application-cog");
iconsAndAliases.put(LOADBALANCER, "call-split");
iconsAndAliases.put(STATEFULSET, "harddisk-plus");
iconsAndAliases.put(REPLICASET, "content-copy");
iconsAndAliases.put(KEYVALUESTORE, "view-list");
iconsAndAliases.put(INTERFACE, "connection");
iconsAndAliases.put(CONTAINER, "inbox");
iconsAndAliases.put(FRONTEND, "television-guide");
iconsAndAliases.put(MESSAGEQUEUE, "tray-full");
iconsAndAliases.put(DEPLOYMENT, "rocket-launch");
iconsAndAliases.put(POD, "application");

Path path = Paths.get("src", "main", "resources", "static", "icons", "meta.json");
ObjectMapper objectMapper = new ObjectMapper().configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false);
try {
MetaEntry[] metaEntries = objectMapper.readValue(path.toFile(), MetaEntry[].class);
Arrays.stream(metaEntries).forEach(metaEntry -> {
iconsAndAliases.put(metaEntry.name, metaEntry.name);
if (metaEntry.aliases != null) {
Arrays.stream(metaEntry.aliases).forEach(s -> iconsAndAliases.put(s, metaEntry.name));
}
});
} catch (IOException e) {
LOGGER.error("Failed to read icon list", e);
}
}

public static Optional<IconMapping> of(String serviceType) {
return Arrays.stream(values())
.filter(iconMapping -> iconMapping.name().equalsIgnoreCase(serviceType))
.findFirst();
public Optional<String> getIcon(@Nullable final String nameOrAlias) {
return Optional.ofNullable(nameOrAlias)
.map(s -> s.toLowerCase(Locale.ROOT))
.flatMap(s -> Optional.ofNullable(iconsAndAliases.get(s)));
}

public String getIcon() {
return icon;
private static class MetaEntry {
// "ab-testing",
public String name;
public String[] aliases;
}
}
4 changes: 3 additions & 1 deletion src/main/java/de/bonndan/nivio/output/icons/IconService.java
Original file line number Diff line number Diff line change
Expand Up @@ -20,10 +20,12 @@ public class IconService {

private final LocalIcons localIcons;
private final ExternalIcons externalIcons;
private final IconMapping iconMapping;

public IconService(LocalIcons localIcons, ExternalIcons externalIcons) {
this.localIcons = localIcons;
this.externalIcons = externalIcons;
this.iconMapping = new IconMapping();
}

/**
Expand Down Expand Up @@ -70,7 +72,7 @@ public String getIconUrl(Item item) {
}

//fallback to item.type
String iconName = IconMapping.of(type.toLowerCase()).map(IconMapping::getIcon).orElseGet(type::toLowerCase);
String iconName = iconMapping.getIcon(type.toLowerCase()).orElseGet(type::toLowerCase);
return localIcons.getIconUrl(iconName).orElse(localIcons.getDefaultIcon());
}

Expand Down
10 changes: 4 additions & 6 deletions src/main/java/de/bonndan/nivio/output/icons/LocalIcons.java
Original file line number Diff line number Diff line change
Expand Up @@ -43,12 +43,12 @@ public class LocalIcons {
* @param iconFolder optional dir containing a different icon set
*/
public LocalIcons(@NonNull final String iconFolder) {
if (!StringUtils.isEmpty(Objects.requireNonNull(iconFolder))) {
if (StringUtils.hasLength(Objects.requireNonNull(iconFolder))) {
this.iconFolder = iconFolder.endsWith("/") || iconFolder.endsWith("\\") ? iconFolder : iconFolder + File.separator;
} else {
this.iconFolder = DEFAULT_ICONS_FOLDER;
}
defaultIcon = getIconUrl(DEFAULT_ICON.getIcon()).orElseThrow(() -> {
defaultIcon = getIconUrl(DEFAULT_ICON).orElseThrow(() -> {
throw new RuntimeException(String.format(initErrorMsg, this.iconFolder));
});
}
Expand All @@ -63,7 +63,7 @@ public LocalIcons() {
* @return an url pointing to a file or a data url
*/
Optional<String> getIconUrl(String icon) {
if (StringUtils.isEmpty(icon)) {
if (!StringUtils.hasLength(icon)) {
return Optional.empty();
}

Expand Down Expand Up @@ -105,9 +105,7 @@ private Optional<String> asSVGDataUrl(String path) {
Optional<String> dataUrl = DataUrlHelper.asBase64(path).map(s -> DataUrlHelper.DATA_IMAGE_SVG_XML_BASE_64 + s);
dataUrl.ifPresentOrElse(
s -> iconDataUrls.put(path, s),
() -> {
LOGGER.warn("Failed to load svg icon {}", path);
}
() -> LOGGER.warn("Failed to load svg icon {}", path)
);
return dataUrl;
}
Expand Down
Loading