diff --git a/apps/dnet-is-application/src/main/java/eu/dnetlib/dsm/DsmAjaxController.java b/apps/dnet-is-application/src/main/java/eu/dnetlib/dsm/DsmAjaxController.java index 330d8e95..a9d49ea1 100644 --- a/apps/dnet-is-application/src/main/java/eu/dnetlib/dsm/DsmAjaxController.java +++ b/apps/dnet-is-application/src/main/java/eu/dnetlib/dsm/DsmAjaxController.java @@ -40,9 +40,9 @@ public class DsmAjaxController extends AbstractDnetController { private ProtocolService protocolService; @GetMapping("/browsableFields") - public List browsableFields() { + public List> browsableFields() { return Arrays.stream(DsmBrowsableFields.values()) - .map(f -> new KeyValue(f.name(), f.desc)) + .map(f -> new KeyValue<>(f.name(), f.desc)) .collect(Collectors.toList()); } diff --git a/apps/dnet-is-application/src/main/java/eu/dnetlib/is/info/InfoAjaxController.java b/apps/dnet-is-application/src/main/java/eu/dnetlib/is/info/InfoAjaxController.java index 8b98de3c..6b0f2b8b 100644 --- a/apps/dnet-is-application/src/main/java/eu/dnetlib/is/info/InfoAjaxController.java +++ b/apps/dnet-is-application/src/main/java/eu/dnetlib/is/info/InfoAjaxController.java @@ -56,30 +56,30 @@ public class InfoAjaxController extends AbstractDnetController { return res; } - private InfoSection jvm() { - final InfoSection jvm = new InfoSection<>("JVM"); - jvm.getData().add(new KeyValue("JVM Name", mxbean.getVmName())); - jvm.getData().add(new KeyValue("JVM Vendor", mxbean.getVmVendor())); - jvm.getData().add(new KeyValue("JVM Version", mxbean.getVmVersion())); - jvm.getData().add(new KeyValue("JVM Spec Name", mxbean.getSpecName())); - jvm.getData().add(new KeyValue("JVM Spec Vendor", mxbean.getSpecVendor())); - jvm.getData().add(new KeyValue("JVM Spec Version", mxbean.getSpecVersion())); - jvm.getData().add(new KeyValue("Running JVM Name", mxbean.getName())); - jvm.getData().add(new KeyValue("Management Spec Version", mxbean.getManagementSpecVersion())); + private InfoSection> jvm() { + final InfoSection> jvm = new InfoSection<>("JVM"); + jvm.getData().add(new KeyValue<>("JVM Name", mxbean.getVmName())); + jvm.getData().add(new KeyValue<>("JVM Vendor", mxbean.getVmVendor())); + jvm.getData().add(new KeyValue<>("JVM Version", mxbean.getVmVersion())); + jvm.getData().add(new KeyValue<>("JVM Spec Name", mxbean.getSpecName())); + jvm.getData().add(new KeyValue<>("JVM Spec Vendor", mxbean.getSpecVendor())); + jvm.getData().add(new KeyValue<>("JVM Spec Version", mxbean.getSpecVersion())); + jvm.getData().add(new KeyValue<>("Running JVM Name", mxbean.getName())); + jvm.getData().add(new KeyValue<>("Management Spec Version", mxbean.getManagementSpecVersion())); return jvm; } - private InfoSection args() { - final InfoSection libs = new InfoSection<>("Arguments"); - libs.getData().add(new KeyValue("Input arguments", StringUtils.join(mxbean.getInputArguments(), " "))); + private InfoSection> args() { + final InfoSection> libs = new InfoSection<>("Arguments"); + libs.getData().add(new KeyValue<>("Input arguments", StringUtils.join(mxbean.getInputArguments(), " "))); return libs; } - private List> props() { - final List> res = new ArrayList<>(); + private List>> props() { + final List>> res = new ArrayList<>(); configurableEnvironment.getPropertySources().forEach(ps -> { - final InfoSection section = new InfoSection<>("Properties: " + ps.getName()); + final InfoSection> section = new InfoSection<>("Properties: " + ps.getName()); addAllProperties(section, ps); res.add(section); }); @@ -87,13 +87,13 @@ public class InfoAjaxController extends AbstractDnetController { return res; } - private void addAllProperties(final InfoSection res, final PropertySource ps) { + private void addAllProperties(final InfoSection> res, final PropertySource ps) { if (ps instanceof CompositePropertySource) { final CompositePropertySource cps = (CompositePropertySource) ps; cps.getPropertySources().forEach(x -> addAllProperties(res, x)); } else if (ps instanceof EnumerablePropertySource) { final EnumerablePropertySource eps = (EnumerablePropertySource) ps; - Arrays.asList(eps.getPropertyNames()).forEach(k -> res.getData().add(new KeyValue(k, eps.getProperty(k)))); + Arrays.asList(eps.getPropertyNames()).forEach(k -> res.getData().add(new KeyValue<>(k, eps.getProperty(k)))); } else {} } diff --git a/apps/dnet-is-application/src/main/java/eu/dnetlib/is/info/KeyValue.java b/apps/dnet-is-application/src/main/java/eu/dnetlib/is/info/KeyValue.java index 082e63fb..e7abe9f9 100644 --- a/apps/dnet-is-application/src/main/java/eu/dnetlib/is/info/KeyValue.java +++ b/apps/dnet-is-application/src/main/java/eu/dnetlib/is/info/KeyValue.java @@ -1,11 +1,11 @@ package eu.dnetlib.is.info; -public class KeyValue { +public class KeyValue { private final String k; - private final Object v; + private final T v; - public KeyValue(final String k, final Object v) { + public KeyValue(final String k, final T v) { this.k = k; this.v = v; } @@ -14,7 +14,7 @@ public class KeyValue { return k; } - public Object getV() { + public T getV() { return v; } diff --git a/apps/dnet-is-application/src/main/java/eu/dnetlib/manager/wf/WfInstancesController.java b/apps/dnet-is-application/src/main/java/eu/dnetlib/manager/wf/WfInstancesController.java index d8fc4096..23e22ad5 100644 --- a/apps/dnet-is-application/src/main/java/eu/dnetlib/manager/wf/WfInstancesController.java +++ b/apps/dnet-is-application/src/main/java/eu/dnetlib/manager/wf/WfInstancesController.java @@ -1,15 +1,17 @@ package eu.dnetlib.manager.wf; import java.util.List; +import java.util.stream.Collectors; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.PathVariable; import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RequestParam; import org.springframework.web.bind.annotation.RestController; import eu.dnetlib.common.controller.AbstractDnetController; +import eu.dnetlib.is.info.KeyValue; import eu.dnetlib.manager.wf.model.WorkflowInstance; -import eu.dnetlib.utils.CountedValue; @RestController @RequestMapping("/ajax/wf_instances") @@ -22,9 +24,18 @@ public class WfInstancesController extends AbstractDnetController { return wfManagerService.findWorkflowInstance(id); } - @GetMapping("/families") - public List listWfFamilies() throws Exception { - return wfManagerService.families(); + @GetMapping("/search") + public List> listWfInstances(@RequestParam final String section) throws Exception { + return wfManagerService.streamWfInstancesBySection(section) + .map(x -> new KeyValue<>(x.getId(), x.getName())) + .collect(Collectors.toList()); + } + + @GetMapping("/sections") + public List> listWfFamilies() throws Exception { + return wfManagerService.streamSections() + .map(x -> new KeyValue<>(x.getValue(), x.getCount())) + .collect(Collectors.toList()); } } diff --git a/frontends/dnet-is-application/src/app/app.module.ts b/frontends/dnet-is-application/src/app/app.module.ts index 374a19b0..59ad6a0c 100644 --- a/frontends/dnet-is-application/src/app/app.module.ts +++ b/frontends/dnet-is-application/src/app/app.module.ts @@ -38,6 +38,7 @@ import { MdstoresComponent, MdstoreInspectorComponent, MDStoreVersionsDialog, Ad import { CleanerTesterComponent } from './cleaner-tester/cleaner-tester.component'; import { EmailDialog, EmailsComponent } from './emails/emails.component'; import { WfInstancesComponent } from './wf-instances/wf-instances.component'; +import { MatTabsModule } from '@angular/material/tabs'; @NgModule({ declarations: [ @@ -100,7 +101,8 @@ import { WfInstancesComponent } from './wf-instances/wf-instances.component'; ReactiveFormsModule, MatSnackBarModule, MatPaginatorModule, - MatProgressSpinnerModule + MatProgressSpinnerModule, + MatTabsModule ], providers: [{ provide: HTTP_INTERCEPTORS, diff --git a/frontends/dnet-is-application/src/app/common/is.service.ts b/frontends/dnet-is-application/src/app/common/is.service.ts index 339da869..80fa5a04 100644 --- a/frontends/dnet-is-application/src/app/common/is.service.ts +++ b/frontends/dnet-is-application/src/app/common/is.service.ts @@ -350,6 +350,27 @@ export class ISService { }); } + loadWfIntancesSections(onSuccess: Function): void { + this.client.get('./ajax/wf_instances/sections').subscribe({ + next: data => onSuccess(data), + error: error => this.showError(error) + }); + } + + loadWfIntances(section: string, onSuccess: Function): void { + this.client.get('./ajax/wf_instances/search?section=' + encodeURIComponent(section)).subscribe({ + next: data => onSuccess(data), + error: error => this.showError(error) + }); + } + + loadWfIntance(id: string, onSuccess: Function): void { + this.client.get('./ajax/wf_instances/instance/' + encodeURIComponent(id)).subscribe({ + next: data => onSuccess(data), + error: error => this.showError(error) + }); + } + private showError(error: any, form?: FormGroup) { console.log(error); diff --git a/frontends/dnet-is-application/src/app/wf-instances/wf-instances.component.html b/frontends/dnet-is-application/src/app/wf-instances/wf-instances.component.html index 87d7cd4b..2efe0381 100644 --- a/frontends/dnet-is-application/src/app/wf-instances/wf-instances.component.html +++ b/frontends/dnet-is-application/src/app/wf-instances/wf-instances.component.html @@ -1 +1,7 @@ -

wfs works!

+

Workflow Instances

+ + + Content 1 + Content 2 + Content 3 + diff --git a/libs/dnet-is-common/src/main/java/eu/dnetlib/manager/wf/model/WorkflowInstance.java b/libs/dnet-is-common/src/main/java/eu/dnetlib/manager/wf/model/WorkflowInstance.java index 0b6ff317..d9478332 100644 --- a/libs/dnet-is-common/src/main/java/eu/dnetlib/manager/wf/model/WorkflowInstance.java +++ b/libs/dnet-is-common/src/main/java/eu/dnetlib/manager/wf/model/WorkflowInstance.java @@ -31,6 +31,12 @@ public class WorkflowInstance implements Serializable { @Column(name = "id") private String id; + @Column(name = "name") + private String name; + + @Column(name = "section") + private String section; + @Type(type = "jsonb") @Column(name = "details", columnDefinition = "jsonb") private Map details = new LinkedHashMap<>(); @@ -87,6 +93,22 @@ public class WorkflowInstance implements Serializable { this.id = id; } + public String getName() { + return name; + } + + public void setName(final String name) { + this.name = name; + } + + public String getSection() { + return section; + } + + public void setSection(final String section) { + this.section = section; + } + public Map getDetails() { return details; } diff --git a/libs/dnet-is-common/src/main/resources/sql/schema.sql b/libs/dnet-is-common/src/main/resources/sql/schema.sql index 2952dc26..041c22ab 100644 --- a/libs/dnet-is-common/src/main/resources/sql/schema.sql +++ b/libs/dnet-is-common/src/main/resources/sql/schema.sql @@ -264,6 +264,8 @@ CREATE TABLE emails ( CREATE TABLE workflow_instances ( id text PRIMARY KEY, + name text NOT NULL, + section text, details jsonb NOT NULL DEFAULT '{}', priority int, dsid text, diff --git a/libs/dnet-is-services/src/main/java/eu/dnetlib/manager/wf/repository/WorkflowInstanceRepository.java b/libs/dnet-is-services/src/main/java/eu/dnetlib/manager/wf/repository/WorkflowInstanceRepository.java index e30934d5..1bab126e 100644 --- a/libs/dnet-is-services/src/main/java/eu/dnetlib/manager/wf/repository/WorkflowInstanceRepository.java +++ b/libs/dnet-is-services/src/main/java/eu/dnetlib/manager/wf/repository/WorkflowInstanceRepository.java @@ -1,6 +1,6 @@ package eu.dnetlib.manager.wf.repository; -import java.util.List; +import java.util.stream.Stream; import org.springframework.data.jpa.repository.JpaRepository; import org.springframework.data.jpa.repository.Query; @@ -10,10 +10,12 @@ import eu.dnetlib.utils.CountedValue; public interface WorkflowInstanceRepository extends JpaRepository { - @Query(value = "select r.subtype as value, count(*) as count " - + "from workflow_instances i join resources r on (i.workflow = r.id) " - + "group by r.subtype " + @Query(value = "select section as value, count(*) as count " + + "from workflow_instances " + + "group by section " + "order by count desc;", nativeQuery = true) - List families(); + Stream streamSections(); + + Stream findBySection(String section); } diff --git a/libs/dnet-wf-service/src/main/java/eu/dnetlib/manager/wf/WorkflowManagerService.java b/libs/dnet-wf-service/src/main/java/eu/dnetlib/manager/wf/WorkflowManagerService.java index 85b88dd4..145b9949 100644 --- a/libs/dnet-wf-service/src/main/java/eu/dnetlib/manager/wf/WorkflowManagerService.java +++ b/libs/dnet-wf-service/src/main/java/eu/dnetlib/manager/wf/WorkflowManagerService.java @@ -1,11 +1,11 @@ package eu.dnetlib.manager.wf; import java.util.HashMap; -import java.util.List; import java.util.Objects; import java.util.UUID; import java.util.concurrent.Executors; import java.util.concurrent.TimeUnit; +import java.util.stream.Stream; import javax.annotation.PostConstruct; @@ -187,8 +187,12 @@ public class WorkflowManagerService implements Stoppable { this.paused = paused; } - public List families() { - return workflowInstanceRepository.families(); + public Stream streamSections() { + return workflowInstanceRepository.streamSections(); + } + + public Stream streamWfInstancesBySection(final String section) { + return workflowInstanceRepository.findBySection(section); } } diff --git a/libs/dnet-wf-service/src/main/java/eu/dnetlib/manager/wf/workflows/procs/WorkflowProcess.java b/libs/dnet-wf-service/src/main/java/eu/dnetlib/manager/wf/workflows/procs/WorkflowProcess.java index 0bb36211..caf32529 100644 --- a/libs/dnet-wf-service/src/main/java/eu/dnetlib/manager/wf/workflows/procs/WorkflowProcess.java +++ b/libs/dnet-wf-service/src/main/java/eu/dnetlib/manager/wf/workflows/procs/WorkflowProcess.java @@ -75,7 +75,7 @@ public class WorkflowProcess implements Comparable { } public String getName() { - return wfMetadata.getName(); + return wfInstance.getName(); } public String getFamily() {