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
2 changes: 1 addition & 1 deletion packages/kie-editors-standalone/src/bpmn/index.ts
Original file line number Diff line number Diff line change
Expand Up @@ -88,7 +88,7 @@ export function open(args: {
stateControl,
{
normalizedPosixPathRelativeToTheWorkspaceRoot: "", // FIXME: https://github.com/apache/incubator-kie-issues/issues/811
fileName: "default", // FIXME: https://github.com/apache/incubator-kie-issues/issues/811
fileName: "", // FIXME: https://github.com/apache/incubator-kie-issues/issues/811
fileExtension: "bpmn",
getFileContents: () => Promise.resolve(args.initialContent),
isReadOnly: args.readOnly ?? false,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -23,6 +23,7 @@ import {
ResourceContentRequest,
ResourceListRequest,
ResourcesList,
ContentType,
} from "@kie-tools-core/workspace/dist/api";
import {
EditorContent,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -20,15 +20,19 @@

package org.kie.workbench.common.stunner.bpmn.client.session;

import java.util.Collection;
import java.util.logging.Logger;

import javax.enterprise.context.ApplicationScoped;
import javax.inject.Inject;

import elemental2.promise.Promise;
import org.kie.workbench.common.stunner.bpmn.client.dataproviders.CalledElementFormProvider;
import org.kie.workbench.common.stunner.bpmn.client.dataproviders.RuleFlowGroupFormProvider;
import org.kie.workbench.common.stunner.bpmn.client.diagram.DiagramTypeClientService;
import org.kie.workbench.common.stunner.bpmn.client.workitem.WorkItemDefinitionClientService;
import org.kie.workbench.common.stunner.bpmn.qualifiers.BPMN;
import org.kie.workbench.common.stunner.bpmn.workitem.WorkItemDefinition;
import org.kie.workbench.common.stunner.core.client.session.impl.SessionInitializer;
import org.kie.workbench.common.stunner.core.diagram.Metadata;
import org.uberfire.mvp.Command;
Expand All @@ -39,15 +43,18 @@ public class BPMNSessionInitializer implements SessionInitializer {

private static Logger LOGGER = Logger.getLogger(BPMNSessionInitializer.class.getName());

private final WorkItemDefinitionClientService workItemDefinitionService;
private final DiagramTypeClientService diagramTypeService;

// CDI proxy.
protected BPMNSessionInitializer() {
this(null);
this(null, null);
}

@Inject
public BPMNSessionInitializer(final DiagramTypeClientService diagramTypeService) {
public BPMNSessionInitializer(final WorkItemDefinitionClientService workItemDefinitionService,
final DiagramTypeClientService diagramTypeService) {
this.workItemDefinitionService = workItemDefinitionService;
this.diagramTypeService = diagramTypeService;
}

Expand All @@ -57,6 +64,16 @@ public void init(final Metadata metadata,
diagramTypeService.loadDiagramType(metadata);
CalledElementFormProvider.initServerData();
RuleFlowGroupFormProvider.initServerData();
completeCallback.execute();
workItemDefinitionService
.call(metadata)
.then(workItemDefinitions -> {
completeCallback.execute();
return null;
})
.catch_((Promise.CatchOnRejectedCallbackFn<Collection<WorkItemDefinition>>) error -> {
LOGGER.severe("Error obtaining the work item definitions [error=" + error + "]");
completeCallback.execute();
return null;
});
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -20,21 +20,34 @@

package org.kie.workbench.common.stunner.bpmn.client.session;

import elemental2.promise.IThenable;
import elemental2.promise.Promise;
import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.kie.workbench.common.stunner.bpmn.client.diagram.DiagramTypeClientService;
import org.kie.workbench.common.stunner.bpmn.client.workitem.WorkItemDefinitionClientService;
import org.kie.workbench.common.stunner.core.diagram.Metadata;
import org.mockito.Mock;
import org.mockito.junit.MockitoJUnitRunner;
import org.uberfire.mvp.Command;

import static org.mockito.ArgumentMatchers.any;
import static org.mockito.Mockito.doReturn;
import static org.mockito.Mockito.eq;
import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.times;
import static org.mockito.Mockito.verify;

@RunWith(MockitoJUnitRunner.class)
public class BPMNSessionInitializerTest {

@Mock
private WorkItemDefinitionClientService workItemDefinitionService;

@Mock
private Promise promise;

@Mock
private DiagramTypeClientService diagramTypeService;

Expand All @@ -43,7 +56,10 @@ public class BPMNSessionInitializerTest {
@Before
@SuppressWarnings("unchecked")
public void setUp() {
tested = new BPMNSessionInitializer(diagramTypeService);
doReturn(promise).when(workItemDefinitionService).call(any(Metadata.class));
doReturn(promise).when(promise).then(any(IThenable.ThenOnFulfilledCallbackFn.class));
doReturn(promise).when(promise).catch_(any(Promise.CatchOnRejectedCallbackFn.class));
tested = new BPMNSessionInitializer(workItemDefinitionService, diagramTypeService);
}

@Test
Expand All @@ -52,5 +68,6 @@ public void testInit() {
Command callback = mock(Command.class);
tested.init(metadata, callback);
verify(diagramTypeService).loadDiagramType(metadata);
verify(workItemDefinitionService, times(1)).call(eq(metadata));
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -25,8 +25,6 @@
import java.util.Collections;
import java.util.LinkedList;
import java.util.List;
import java.util.logging.Level;
import java.util.logging.Logger;

import javax.annotation.PostConstruct;
import javax.annotation.PreDestroy;
Expand All @@ -45,20 +43,16 @@
import org.kie.workbench.common.stunner.core.diagram.Metadata;
import org.kie.workbench.common.stunner.kogito.client.services.util.WidPresetResources;
import org.kie.workbench.common.stunner.kogito.client.services.util.WorkItemIconCache;
import org.uberfire.backend.vfs.Path;
import org.uberfire.client.promise.Promises;

import static java.util.Arrays.asList;
import static java.util.Collections.emptyList;
import static org.kie.workbench.common.stunner.bpmn.client.workitem.WorkItemDefinitionClientParser.parse;
import static org.kie.workbench.common.stunner.core.util.StringUtils.isEmpty;
import static org.kie.workbench.common.stunner.core.util.StringUtils.nonEmpty;

@ApplicationScoped
public class WorkItemDefinitionStandaloneClientService implements WorkItemDefinitionClientService {

private static Logger LOGGER = Logger.getLogger(WorkItemDefinitionStandaloneClientService.class.getName());

private static final String RESOURCE_ALL_WID_PATTERN = "*.wid";
private static final String RESOURCE_GLOBAL_DIRECTORY_WID_PATTERN = "global/*.wid";
private static final String MILESTONE_ICON = "defaultmilestoneicon.png";
Expand All @@ -69,6 +63,10 @@ public class WorkItemDefinitionStandaloneClientService implements WorkItemDefini
private final ResourceContentService resourceContentService;
private final WorkItemIconCache workItemIconCache;

// Cache the promise, as by definition will be performed just once,
// so the available work item definitions will be also just registered once, by app.
private Promise<Collection<WorkItemDefinition>> loader;

@Inject
public WorkItemDefinitionStandaloneClientService(final Promises promises,
final WorkItemDefinitionCacheRegistry registry,
Expand All @@ -83,6 +81,7 @@ public WorkItemDefinitionStandaloneClientService(final Promises promises,

@PostConstruct
public void init() {
loader = allWorkItemsLoader();
}

@Produces
Expand All @@ -94,34 +93,24 @@ public WorkItemDefinitionRegistry getRegistry() {

@Override
public Promise<Collection<WorkItemDefinition>> call(final Metadata input) {
return allWorkItemsLoader(input.getPath());
return loader;
}

@PreDestroy
public void destroy() {
registry.clear();
loader = null;
}


private Promise<Collection<WorkItemDefinition>> allWorkItemsLoader(Path openedDiagramPath) {

final int lastSlashIndex = openedDiagramPath != null ? openedDiagramPath.toURI().lastIndexOf('/') : -1;
final String directoryPath = (lastSlashIndex != -1)
? openedDiagramPath.toURI().substring(0, lastSlashIndex + 1)
: "";

final String widPattern = (openedDiagramPath == null || isEmpty(directoryPath)) ? RESOURCE_ALL_WID_PATTERN : directoryPath + RESOURCE_ALL_WID_PATTERN;

private Promise<Collection<WorkItemDefinition>> allWorkItemsLoader() {
return promises.create((success, failure) -> {
registry.clear();
final List<WorkItemDefinition> loaded = new LinkedList<>();
LOGGER.log(Level.INFO, "Searching WID using pattern: " + RESOURCE_GLOBAL_DIRECTORY_WID_PATTERN);
resourceContentService
.list(RESOURCE_GLOBAL_DIRECTORY_WID_PATTERN, ResourceListOptions.assetFolder())
.list(RESOURCE_GLOBAL_DIRECTORY_WID_PATTERN, ResourceListOptions.traversal())
.then(paths1 -> {
LOGGER.log(Level.INFO, "Searching WID using pattern: " + widPattern);
resourceContentService
.list(widPattern, ResourceListOptions.assetFolder())
.list(RESOURCE_ALL_WID_PATTERN, ResourceListOptions.assetFolder())
.then(paths2 -> {
String[] paths = mergeTwoArrays(paths1, paths2);
if (paths.length > 0) {
Expand Down Expand Up @@ -169,7 +158,7 @@ private Promise<Collection<WorkItemDefinition>> presetWorkItemsLoader(final Coll
private Promise<Collection<WorkItemDefinition>> workItemsLoader(final String path,
final Collection<WorkItemDefinition> loaded) {
int lastDirIndex = path.lastIndexOf('/');
final String directory = (lastDirIndex >= 0) ? path.substring(0, lastDirIndex) + "/" : "";
final String directory = (lastDirIndex >= 0) ? path.substring(0, lastDirIndex) + "/" : path;
if (nonEmpty(path)) {
return resourceContentService
.get(path)
Expand Down Expand Up @@ -209,10 +198,7 @@ String getMilestoneIconAsBase64() {
}

private Promise<Collection<WorkItemDefinition>> getPromises(final List<WorkItemDefinition> wids, final Collection<WorkItemDefinition> loaded, final String path) {
wids.forEach(w -> {
LOGGER.log(Level.INFO, "WID Icon: " + path + w.getIconDefinition().getUri());
w.getIconDefinition().setUri(path + w.getIconDefinition().getUri());
});
wids.forEach(w -> w.getIconDefinition().setUri(path + w.getIconDefinition().getUri()));
return promises.create((success, failure) -> {
promises.all(wids, this::workItemIconLoader)
.then(wid -> {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -60,7 +60,7 @@ public class BPMNDesignerKogitoSeleniumIT {
private static final Logger LOG = LoggerFactory.getLogger(BPMNDesignerKogitoSeleniumIT.class);

private static final String SET_CONTENT_TEMPLATE =
"gwtEditorBeans.get(\"BPMNDiagramEditor\").get().setContent(\"default\", '%s')";
"gwtEditorBeans.get(\"BPMNDiagramEditor\").get().setContent(\"\", '%s')";
private static final String GET_CONTENT_TEMPLATE =
"return gwtEditorBeans.get(\"BPMNDiagramEditor\").get().getContent()";

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -22,7 +22,6 @@

import java.util.Collection;
import java.util.Objects;
import java.util.logging.Level;
import java.util.logging.Logger;

import javax.enterprise.context.ApplicationScoped;
Expand Down Expand Up @@ -52,7 +51,6 @@
import org.kie.workbench.common.stunner.core.graph.content.definition.DefinitionSet;
import org.kie.workbench.common.stunner.core.graph.util.GraphUtils;
import org.kie.workbench.common.stunner.kogito.client.service.AbstractKogitoClientDiagramService;
import org.uberfire.backend.vfs.PathFactory;
import org.uberfire.client.promise.Promises;

import static org.kie.workbench.common.stunner.bpmn.util.XmlUtils.createValidId;
Expand Down Expand Up @@ -98,23 +96,20 @@ public BPMNClientDiagramService(final DefinitionManager definitionManager,
@Override
public void transform(final String xml,
final ServiceCallback<Diagram> callback) {
doTransform(DEFAULT_DIAGRAM_ID, DEFAULT_DIAGRAM_ID, xml, callback);
doTransform(DEFAULT_DIAGRAM_ID, xml, callback);
}

@Override
public void transform(final String fileName,
final String xml,
final ServiceCallback<Diagram> callback) {
doTransform(createDiagramTitleFromFilePath(fileName), fileName, xml, callback);
doTransform(createDiagramTitleFromFilePath(fileName), xml, callback);
}

private void doTransform(final String fileName,
final String fileRelativePath,
final String xml,
final ServiceCallback<Diagram> callback) {
final Metadata metadata = createMetadata();
metadata.setPath(PathFactory.newPath(fileName, fileRelativePath));
LOGGER.log(Level.INFO, "Loading a file: [fileRelativePath: " + fileRelativePath + ", fileName: " + fileName + "]");
final Metadata metadata = createMetadata();
widService
.call(metadata)
.then(wid -> {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -18,6 +18,7 @@
*/

import {
ContentType,
ResourceContent,
ResourceContentOptions,
ResourceContentService,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -18,6 +18,7 @@
*/

import {
ContentType,
ResourceContent,
ResourceContentOptions,
ResourceContentService,
Expand Down Expand Up @@ -101,48 +102,19 @@ export class VsCodeResourceContentServiceForWorkspaces implements ResourceConten
return matchesPattern && conformsToSearchType;
}
);

if (matchingNormalizedPosixPathsRelativeToTheBasePath.length > 0) {
return new ResourcesList(pattern, matchingNormalizedPosixPathsRelativeToTheBasePath);
} else {
console.debug(
"VS CODE RESOURCE CONTENT API IMPL FOR WORKSPACES: Git search returned no matches. Falling back to VS Code API."
);
}
return new ResourcesList(pattern, matchingNormalizedPosixPathsRelativeToTheBasePath);
} catch (error) {
console.debug(
"VS CODE RESOURCE CONTENT API IMPL FOR WORKSPACES: Failed to use isomorphic-git to read dir. Falling back to VS Code API.",
"VS CODE RESOURCE CONTENT API IMPL FOR WORKSPACES: Failed to use isomorphic-git to read dir. Falling back to vscode's API.",
error
);
}

const relativePattern = new RelativePattern(this.args.workspaceRootAbsoluteFsPath, pattern);

// Build exclude pattern from .gitignore
let excludePattern = "{node_modules,.git,dist,target,out,build,.vscode,.idea}/**"; // Default excludes
try {
const gitignorePath = __path.join(this.args.workspaceRootAbsoluteFsPath, ".gitignore");
const content = (await vscode.workspace.fs.readFile(vscode.Uri.file(gitignorePath))).toString();
const lines = content
.split("\n")
.map((line) => line.trim())
.filter((line) => line && !line.startsWith("#"));
if (lines.length > 0) {
excludePattern += `,{${lines.join(",")}}/**`;
}
} catch {
console.debug(
"VS CODE RESOURCE CONTENT API IMPL FOR WORKSPACES: .gitignore not found or unreadable, using default excludes."
const relativePattern = new RelativePattern(baseAbsoluteFsPath, pattern);
const files = await vscode.workspace.findFiles(relativePattern);
const normalizedPosixPathsRelativeToTheWorkspaceRoot = files.map((uri) =>
vscode.workspace.asRelativePath(uri, false)
);
return new ResourcesList(pattern, normalizedPosixPathsRelativeToTheWorkspaceRoot);
}

const files = await vscode.workspace.findFiles(relativePattern, excludePattern);

const normalizedPosixPathsRelativeToTheWorkspaceRoot = files.map((uri) =>
vscode.workspace.asRelativePath(uri, false)
);

return new ResourcesList(pattern, normalizedPosixPathsRelativeToTheWorkspaceRoot);
}

public async get(
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -19,7 +19,7 @@

import React, { useEffect, useState } from "react";
import { useCallback, useMemo } from "react";
import { ResourceContentOptions, ResourceListOptions } from "@kie-tools-core/workspace/dist/api";
import { ResourceContentOptions } from "@kie-tools-core/workspace/dist/api";
import { WorkspaceFile, WorkspacesContext } from "./WorkspacesContext";
import { LocalFile } from "../worker/api/LocalFile";
import {
Expand Down Expand Up @@ -486,7 +486,7 @@ export function WorkspacesContextProvider(props: Props) {
);

const resourceContentList = useCallback(
async (args: { workspaceId: string; globPattern: string; opts?: ResourceListOptions }) =>
async (args: { workspaceId: string; globPattern: string }) =>
workspacesSharedWorker.withBus((workspacesWorkerBus) =>
workspacesWorkerBus.clientApi.requests.kieSandboxWorkspacesStorage_resourceContentList(args)
),
Expand Down
Loading
Loading