Skip to content
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
452 changes: 434 additions & 18 deletions bom/application/pom.xml

Large diffs are not rendered by default.

Original file line number Diff line number Diff line change
Expand Up @@ -32,19 +32,16 @@ CardPageBuildItem create(CurateOutcomeBuildItem bi) {
@BuildStep(onlyIf = IsDevelopment.class)
JsonRPCProvidersBuildItem createJsonRPCServiceForCache() {
DevConsoleManager.register("kubernetes-generate-manifest", ignored -> {
System.out.println("calling action");
try {
List<KubernetesDevConsoleProcessor.Manifest> manifests = holder.getManifests();
// Avoid relying on databind.
Map<String, String> map = new LinkedHashMap<>();
System.out.println("manifests are " + manifests);
for (KubernetesDevConsoleProcessor.Manifest manifest : manifests) {
map.put(manifest.getName(), manifest.getContent());
System.out.println("added " + manifest.getName());
}
return map;
} catch (Exception e) {
e.printStackTrace();
throw new RuntimeException(e);
}
});
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,7 @@ import '@vanillawc/wc-codemirror/mode/yaml/yaml.js';
import '@vaadin/icon';
import '@vaadin/tabs';
import '@vaadin/tabsheet';
import '@vaadin/progress-bar';

export class QwcKubernetesManifest extends observeState(LitElement) {

Expand Down Expand Up @@ -65,7 +66,12 @@ export class QwcKubernetesManifest extends observeState(LitElement) {
</vaadin-tabsheet>
`;
}else{
return html`<span>${this._message}</span>`;
return html`
<div style="color: var(--lumo-secondary-text-color);width: 95%;" >
<div>${this._message}</div>
<vaadin-progress-bar indeterminate></vaadin-progress-bar>
</div>
`;
}
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -34,6 +34,10 @@ public void addBuildTimeData(String fieldName, Object fieldData) {
this.buildTimeData.put(fieldName, fieldData);
}

public void addAllBuildTimeData(Map<String, Object> buildTimeData) {
this.buildTimeData.putAll(buildTimeData);
}

public Map<String, Object> getBuildTimeData() {
return this.buildTimeData;
}
Expand Down
Original file line number Diff line number Diff line change
@@ -1,8 +1,5 @@
package io.quarkus.devui.deployment;

import static io.quarkus.vertx.http.deployment.devmode.console.ConfigEditorProcessor.cleanUpAsciiDocIfNecessary;
import static io.quarkus.vertx.http.deployment.devmode.console.ConfigEditorProcessor.isSetByDevServices;

import java.io.IOException;
import java.io.InputStream;
import java.io.UncheckedIOException;
Expand All @@ -15,10 +12,7 @@
import java.util.HashSet;
import java.util.List;
import java.util.Map;
import java.util.Optional;
import java.util.Set;
import java.util.regex.Pattern;
import java.util.stream.Collectors;

import org.eclipse.microprofile.config.Config;
import org.eclipse.microprofile.config.ConfigProvider;
Expand All @@ -31,13 +25,9 @@
import io.quarkus.deployment.IsDevelopment;
import io.quarkus.deployment.annotations.BuildProducer;
import io.quarkus.deployment.annotations.BuildStep;
import io.quarkus.deployment.builditem.ConfigDescriptionBuildItem;
import io.quarkus.deployment.builditem.DevServicesLauncherConfigResultBuildItem;
import io.quarkus.deployment.dev.devservices.DevServiceDescriptionBuildItem;
import io.quarkus.deployment.pkg.builditem.CurateOutcomeBuildItem;
import io.quarkus.deployment.util.IoUtil;
import io.quarkus.devui.deployment.extension.Extension;
import io.quarkus.devui.deployment.extension.ExtensionGroup;
import io.quarkus.devui.spi.AbstractDevUIBuildItem;
import io.quarkus.devui.spi.DevUIContent;
import io.quarkus.devui.spi.buildtime.QuteTemplateBuildItem;
Expand All @@ -46,7 +36,6 @@
import io.quarkus.devui.spi.page.Page;
import io.quarkus.devui.spi.page.PageBuilder;
import io.quarkus.vertx.http.deployment.NonApplicationRootPathBuildItem;
import io.quarkus.vertx.http.runtime.devmode.ConfigDescription;
import io.vertx.core.json.jackson.DatabindCodec;

/**
Expand Down Expand Up @@ -75,17 +64,18 @@ InternalImportMapBuildItem createKnownInternalImportMap(NonApplicationRootPathBu
// Quarkus Web Components
internalImportMapBuildItem.add("qwc/", contextRoot + "qwc/");
internalImportMapBuildItem.add("qwc-hot-reload-element", contextRoot + "qwc/qwc-hot-reload-element.js");
internalImportMapBuildItem.add("qwc-server-log", contextRoot + "qwc/qwc-server-log.js");
// Quarkus UI
internalImportMapBuildItem.add("qui/", contextRoot + "qui/");
internalImportMapBuildItem.add("qui-badge", contextRoot + "qui/qui-badge.js");
internalImportMapBuildItem.add("qui-alert", contextRoot + "qui/qui-alert.js");
// Echarts
internalImportMapBuildItem.add("echarts/", contextRoot + "echarts/");
internalImportMapBuildItem.add("echarts-gauge-grade", contextRoot + "echarts/echarts-gauge-grade.js");
internalImportMapBuildItem.add("echarts-pie", contextRoot + "echarts/echarts-pie.js");

// Other assets
internalImportMapBuildItem.add("icon/", contextRoot + "icon/");
internalImportMapBuildItem.add("font/", contextRoot + "font/");
// Controllers
internalImportMapBuildItem.add("controller/", contextRoot + "controller/");
internalImportMapBuildItem.add("log-controller", contextRoot + "controller/log-controller.js");
Expand Down Expand Up @@ -298,14 +288,22 @@ void loadAllBuildTimeTemplates(BuildProducer<StaticContentBuildItem> buildTimeCo
@BuildStep(onlyIf = IsDevelopment.class)
void createBuildTimeData(BuildProducer<BuildTimeConstBuildItem> buildTimeConstProducer,
BuildProducer<ThemeVarsBuildItem> themeVarsProducer,
NonApplicationRootPathBuildItem nonApplicationRootPathBuildItem,
List<InternalPageBuildItem> internalPages,
ExtensionsBuildItem extensionsBuildItem,
List<DevServiceDescriptionBuildItem> devServiceDescriptions,
List<ConfigDescriptionBuildItem> configDescriptionBuildItems,
Optional<DevServicesLauncherConfigResultBuildItem> devServicesLauncherConfig) {
NonApplicationRootPathBuildItem nonApplicationRootPathBuildItem) {

BuildTimeConstBuildItem internalBuildTimeData = new BuildTimeConstBuildItem(AbstractDevUIBuildItem.DEV_UI);

addThemeBuildTimeData(internalBuildTimeData, themeVarsProducer);
addMenuSectionBuildTimeData(internalBuildTimeData, internalPages, extensionsBuildItem);
addFooterTabBuildTimeData(internalBuildTimeData, extensionsBuildItem);
addVersionInfoBuildTimeData(internalBuildTimeData, nonApplicationRootPathBuildItem);

buildTimeConstProducer.produce(internalBuildTimeData);
}

private void addThemeBuildTimeData(BuildTimeConstBuildItem internalBuildTimeData,
BuildProducer<ThemeVarsBuildItem> themeVarsProducer) {
// Theme details TODO: Allow configuration
Map<String, Map<String, String>> themes = new HashMap<>();
Map<String, String> dark = new HashMap<>();
Expand All @@ -315,100 +313,74 @@ void createBuildTimeData(BuildProducer<BuildTimeConstBuildItem> buildTimeConstPr

internalBuildTimeData.addBuildTimeData("themes", themes);

// Extensions
Map<ExtensionGroup, List<Extension>> response = Map.of(
ExtensionGroup.active, extensionsBuildItem.getActiveExtensions(),
ExtensionGroup.inactive, extensionsBuildItem.getInactiveExtensions());

internalBuildTimeData.addBuildTimeData("extensions", response);

// Sections Menu
Page extensions = Page.webComponentPageBuilder().internal()
.namespace("devui-extensions")
.title("Extensions")
.icon("font-awesome-solid:puzzle-piece")
.componentLink("qwc-extensions.js").build();

Page configuration = Page.webComponentPageBuilder().internal()
.namespace("devui-configuration")
.title("Configuration")
.icon("font-awesome-solid:sliders")
.componentLink("qwc-configuration.js").build();

Page configurationSourceEditor = Page.webComponentPageBuilder().internal()
.namespace("devui-configuration")
.title("Config Editor")
.icon("font-awesome-solid:code")
.componentLink("qwc-configuration-editor.js").build();

internalBuildTimeData.addBuildTimeData("allConfiguration",
getAllConfig(configDescriptionBuildItems, devServicesLauncherConfig));

Page continuousTesting = Page.webComponentPageBuilder().internal()
.namespace("devui-continuous-testing")
.title("Continuous Testing")
.icon("font-awesome-solid:flask-vial")
.componentLink("qwc-continuous-testing.js").build();

internalBuildTimeData.addBuildTimeData("continuousTesting", "TODO: Continuous Testing");

Page devServices = Page.webComponentPageBuilder().internal()
.namespace("devui-dev-services")
.title("Dev services")
.icon("font-awesome-solid:wand-magic-sparkles")
.componentLink("qwc-dev-services.js").build();

internalBuildTimeData.addBuildTimeData("devServices", devServiceDescriptions);

Page buildSteps = Page.webComponentPageBuilder().internal()
.namespace("devui-build-metrics")
.title("Build Steps")
.icon("font-awesome-solid:hammer")
.componentLink("qwc-build-steps.js").build();

Page buildItems = Page.webComponentPageBuilder().internal()
.namespace("devui-build-metrics")
.title("Build Items")
.icon("font-awesome-solid:trowel")
.componentLink("qwc-build-items.js").build();
// Also set at least one there for a default
themeVarsProducer.produce(new ThemeVarsBuildItem(light.keySet(), QUARKUS_BLUE.toString()));
}

// Add default menu items
List<Page> sectionMenu = new ArrayList<>(
List.of(extensions, configuration, configurationSourceEditor, continuousTesting, devServices,
buildSteps, buildItems));
private void addMenuSectionBuildTimeData(BuildTimeConstBuildItem internalBuildTimeData,
List<InternalPageBuildItem> internalPages,
ExtensionsBuildItem extensionsBuildItem) {
// Menu section
List<Page> sectionMenu = new ArrayList();
Collections.sort(internalPages, (t, t1) -> {
return ((Integer) t.getPosition()).compareTo(t1.getPosition());
});

for (InternalPageBuildItem internalPageBuildItem : internalPages) {
List<Page> pages = internalPageBuildItem.getPages();
for (Page page : pages) {
sectionMenu.add(page);
}
internalBuildTimeData.addAllBuildTimeData(internalPageBuildItem.getBuildTimeData());
}

// Add any Menus from extensions
// Menus from extensions
for (Extension e : extensionsBuildItem.getSectionMenuExtensions()) {
List<Page> pagesFromExtension = e.getMenuPages();
sectionMenu.addAll(pagesFromExtension);
}

internalBuildTimeData.addBuildTimeData("menuItems", sectionMenu);
}

private void addFooterTabBuildTimeData(BuildTimeConstBuildItem internalBuildTimeData,
ExtensionsBuildItem extensionsBuildItem) {
// Add the Footer tabs
List<Page> footerTabs = new ArrayList();
Page serverLog = Page.webComponentPageBuilder().internal()
.namespace("devui-logstream")
.title("Server")
.icon("font-awesome-solid:server")
.componentLink("qwc-server-log.js").build();
footerTabs.add(serverLog);

Page devUiLog = Page.webComponentPageBuilder().internal()
.namespace("devui-jsonrpcstream")
.title("Dev UI")
.icon("font-awesome-solid:satellite-dish")
.componentLink("qwc-jsonrpc-messages.js").build();

@SuppressWarnings("unchecked")
List<Page> footerTabs = new ArrayList(List.of(serverLog, devUiLog));

Page testLog = Page.webComponentPageBuilder().internal()
.namespace("devui-continuous-testing")
.title("Testing")
.icon("font-awesome-solid:flask-vial")
.componentLink("qwc-test-log.js").build();
footerTabs.add(testLog);

// This is only needed when extension developers work on an extension, so we only included it if you build from source.
if (Version.getVersion().equalsIgnoreCase("999-SNAPSHOT")) {
Page devUiLog = Page.webComponentPageBuilder().internal()
.namespace("devui-jsonrpcstream")
.title("Dev UI")
.icon("font-awesome-solid:satellite-dish")
.componentLink("qwc-jsonrpc-messages.js").build();
footerTabs.add(devUiLog);
}
// Add any Footer tabs from extensions
for (Extension e : extensionsBuildItem.getFooterTabsExtensions()) {
List<Page> tabsFromExtension = e.getFooterPages();
footerTabs.addAll(tabsFromExtension);
}

internalBuildTimeData.addBuildTimeData("footerTabs", footerTabs);
}

private void addVersionInfoBuildTimeData(BuildTimeConstBuildItem internalBuildTimeData,
NonApplicationRootPathBuildItem nonApplicationRootPathBuildItem) {
// Add version info
String contextRoot = nonApplicationRootPathBuildItem.getNonApplicationRootPath() + DEV_UI + SLASH;
Map<String, String> applicationInfo = new HashMap<>();
Expand All @@ -418,10 +390,6 @@ void createBuildTimeData(BuildProducer<BuildTimeConstBuildItem> buildTimeConstPr
applicationInfo.put("applicationVersion",
config.getOptionalValue("quarkus.application.version", String.class).orElse(""));
internalBuildTimeData.addBuildTimeData("applicationInfo", applicationInfo);

buildTimeConstProducer.produce(internalBuildTimeData);

themeVarsProducer.produce(new ThemeVarsBuildItem(light.keySet(), QUARKUS_BLUE.toString()));
}

private static void computeColors(Map<String, Map<String, String>> themes, Map<String, String> dark,
Expand Down Expand Up @@ -530,22 +498,6 @@ private static void computeColors(Map<String, Map<String, String>> themes, Map<S
themes.put("light", light);
}

private List<ConfigDescription> getAllConfig(List<ConfigDescriptionBuildItem> configDescriptionBuildItems,
Optional<DevServicesLauncherConfigResultBuildItem> devServicesLauncherConfig) {
List<ConfigDescription> configDescriptions = new ArrayList<>();
for (ConfigDescriptionBuildItem item : configDescriptionBuildItems) {
configDescriptions.add(
new ConfigDescription(item.getPropertyName(),
formatJavadoc(cleanUpAsciiDocIfNecessary(item.getDocs())),
item.getDefaultValue(),
isSetByDevServices(devServicesLauncherConfig, item.getPropertyName()),
item.getValueTypeName(),
item.getAllowedValues(),
item.getConfigPhase().name()));
}
return configDescriptions;
}

private static final Color QUARKUS_BLUE = Color.from(211, 63, 54);
private static final Color QUARKUS_RED = Color.from(343, 100, 50);
private static final Color QUARKUS_DARK = Color.from(180, 36, 5);
Expand Down Expand Up @@ -604,20 +556,4 @@ static Color from(int hue, int saturation, int lightness, double alpha) {
return new Color(hue, saturation, lightness, alpha);
}
}

private static final Pattern codePattern = Pattern.compile("(\\{@code )([^}]+)(\\})");
private static final Pattern linkPattern = Pattern.compile("(\\{@link )([^}]+)(\\})");

static String formatJavadoc(String val) {
if (val == null) {
return val;
}
// Replace {@code} and {@link}
val = codePattern.matcher(val).replaceAll("<code>$2</code>");
val = linkPattern.matcher(val).replaceAll("<code>$2</code>");
// Add br before @see and @deprecated
val = val.lines().filter(s -> !s.startsWith("@see")).collect(Collectors.joining("\n"));
val = val.replace("@deprecated", "<br><strong>Deprecated</strong>");
return val;
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,51 @@
package io.quarkus.devui.deployment;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import io.quarkus.builder.item.MultiBuildItem;
import io.quarkus.devui.spi.page.Page;
import io.quarkus.devui.spi.page.PageBuilder;

/**
* Used internally to define some of our own pages
*/
public final class InternalPageBuildItem extends MultiBuildItem {

private final String namespaceLabel;
private final int position;
private final List<Page> pages = new ArrayList<>();
private final Map<String, Object> buildTimeData = new HashMap<>();

public InternalPageBuildItem(String namespaceLabel, int position) {
this.namespaceLabel = namespaceLabel;
this.position = position;
}

public void addPage(PageBuilder page) {
page = (PageBuilder) page.internal(this.namespaceLabel);
this.pages.add(page.build());
}

public void addBuildTimeData(String key, Object value) {
this.buildTimeData.put(key, value);
}

public List<Page> getPages() {
return pages;
}

public int getPosition() {
return position;
}

public String getNamespaceLabel() {
return namespaceLabel;
}

public Map<String, Object> getBuildTimeData() {
return buildTimeData;
}
}
Loading