Skip to content

Commit

Permalink
Merge branch 'master' into cgmes_conversion_T2x
Browse files Browse the repository at this point in the history
  • Loading branch information
miovd committed Nov 15, 2019
2 parents 3150c26 + 2844971 commit a96f59d
Show file tree
Hide file tree
Showing 10 changed files with 143 additions and 27 deletions.
19 changes: 18 additions & 1 deletion afs/afs-core/src/main/java/com/powsybl/afs/AppFileSystem.java
Original file line number Diff line number Diff line change
Expand Up @@ -14,9 +14,9 @@
import com.powsybl.afs.storage.NodeInfo;

import java.util.Objects;
import java.util.Optional;

/**
*
* An AppFileSystem instance is a tree of {@link Node} objects, starting with its root folder.
* <p>
* {@link Node} objects may be {@link Folder}s or {@link File}, or any new file type added
Expand Down Expand Up @@ -123,6 +123,23 @@ public <T extends ProjectFile> T findProjectFile(String projectFileId, Class<T>
return (T) projectFile;
}

/**
* Get a project by its ID
*
* @param projectId projectID
* @return the optionally found project
*/
public Optional<Project> findProject(String projectId) {
Objects.requireNonNull(projectId);

NodeInfo projectInfo = storage.getNodeInfo(projectId);
if (projectInfo != null && Project.PSEUDO_CLASS.equals(projectInfo.getPseudoClass())) {
return Optional.of(new Project(new FileCreationContext(projectInfo, storage, this)));
}

return Optional.empty();
}

/**
* Get a project folder by its ID.
*/
Expand Down
14 changes: 11 additions & 3 deletions afs/afs-core/src/main/java/com/powsybl/afs/LocalTaskMonitor.java
Original file line number Diff line number Diff line change
Expand Up @@ -27,15 +27,23 @@ public class LocalTaskMonitor implements TaskMonitor {
@Override
public Task startTask(ProjectFile projectFile) {
Objects.requireNonNull(projectFile);

return startTask(projectFile.getName(), projectFile.getProject());
}

@Override
public Task startTask(String name, Project project) {
Objects.requireNonNull(name);
Objects.requireNonNull(project);

lock.lock();
try {
revision++;
String taskName = projectFile.getPath().toString();
Task task = new Task(taskName, null, revision, projectFile.getProject().getId());
Task task = new Task(name, null, revision, project.getId());
tasks.put(task.getId(), task);

// notification
notifyListeners(new StartTaskEvent(task.getId(), revision, taskName), task.getProjectId());
notifyListeners(new StartTaskEvent(task.getId(), revision, name), task.getProjectId());

return task;
} finally {
Expand Down
2 changes: 2 additions & 0 deletions afs/afs-core/src/main/java/com/powsybl/afs/TaskMonitor.java
Original file line number Diff line number Diff line change
Expand Up @@ -142,6 +142,8 @@ public boolean equals(Object obj) {

Task startTask(ProjectFile projectFile);

Task startTask(String name, Project project);

void stopTask(UUID id);

void updateTaskMessage(UUID id, String message);
Expand Down
23 changes: 21 additions & 2 deletions afs/afs-core/src/test/java/com/powsybl/afs/AfsBaseTest.java
Original file line number Diff line number Diff line change
Expand Up @@ -21,8 +21,13 @@

import java.io.IOException;
import java.io.UncheckedIOException;
import java.nio.file.*;
import java.util.*;
import java.nio.file.FileSystem;
import java.nio.file.Files;
import java.nio.file.Path;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collections;
import java.util.List;

import static org.junit.Assert.*;

Expand Down Expand Up @@ -275,4 +280,18 @@ public void findProjectFileTest() {
assertEquals(createdFile.getDependencies(), foundFile.getDependencies());
assertEquals(createdFile.getCodeVersion(), foundFile.getCodeVersion());
}

@Test
public void findProjectTest() {
Project project = afs.getRootFolder().createProject("test");
Project foundProject = afs.findProject(project.getId()).orElse(null);
assertNotNull(foundProject);
assertEquals(project.getId(), foundProject.getId());
assertEquals(project.getName(), foundProject.getName());
assertEquals(project.getDescription(), foundProject.getDescription());
assertEquals(project.getCreationDate(), foundProject.getCreationDate());
assertEquals(project.getModificationDate(), foundProject.getModificationDate());
assertEquals(project.getFileSystem(), foundProject.getFileSystem());
assertEquals(project.getCodeVersion(), foundProject.getCodeVersion());
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -40,7 +40,7 @@ public abstract class AbstractAppStorageTest {
static final String FOLDER_PSEUDO_CLASS = "folder";
static final String DATA_FILE_CLASS = "data";

private ListenableAppStorage storage;
protected ListenableAppStorage storage;

private BlockingQueue<NodeEvent> eventStack;

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -7,10 +7,7 @@
package com.powsybl.afs.ws.server;

import com.google.common.io.ByteStreams;
import com.powsybl.afs.AfsException;
import com.powsybl.afs.AppFileSystem;
import com.powsybl.afs.ProjectFile;
import com.powsybl.afs.TaskMonitor;
import com.powsybl.afs.*;
import com.powsybl.afs.storage.AppStorage;
import com.powsybl.afs.storage.NodeDependency;
import com.powsybl.afs.storage.NodeGenericMetadata;
Expand Down Expand Up @@ -595,13 +592,25 @@ public Response getNodeInfo(@ApiParam(value = "File system name") @PathParam("fi
@Produces(MediaType.APPLICATION_JSON)
@Path("fileSystems/{fileSystemName}/tasks")
public Response startTask(@PathParam("fileSystemName") String fileSystemName,
@QueryParam("projectFileId") String projectFileId) {
@QueryParam("projectFileId") String projectFileId,
@QueryParam("projectId") String projectId,
@QueryParam("name") String name) {
AppFileSystem fileSystem = appDataBean.getFileSystem(fileSystemName);
ProjectFile projectFile = fileSystem.findProjectFile(projectFileId, ProjectFile.class);
if (projectFile == null) {
throw new AfsException("Project file '" + projectFileId + "' not found in file system '" + fileSystemName + "'");
TaskMonitor.Task task;
if (projectFileId != null) {
ProjectFile projectFile = fileSystem.findProjectFile(projectFileId, ProjectFile.class);
if (projectFile == null) {
throw new AfsException("Project file '" + projectFileId + "' not found in file system '" + fileSystemName + "'");
}
task = fileSystem.getTaskMonitor().startTask(projectFile);
} else if (projectId != null && name != null) {
Project project = fileSystem
.findProject(projectId)
.orElseThrow(() -> new AfsException("Project '" + projectId + "' not found in file system '" + fileSystemName + "'"));
task = fileSystem.getTaskMonitor().startTask(name, project);
} else {
throw new AfsException("Missing arguments");
}
TaskMonitor.Task task = fileSystem.getTaskMonitor().startTask(projectFile);
return Response.ok().entity(task).build();
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,7 @@
package com.powsybl.afs.ws.server;

import com.powsybl.afs.AppData;
import com.powsybl.afs.AppFileSystem;
import com.powsybl.afs.mapdb.storage.MapDbAppStorage;
import com.powsybl.afs.storage.DefaultListenableAppStorage;
import com.powsybl.afs.storage.ListenableAppStorage;
Expand All @@ -18,6 +19,8 @@
import javax.inject.Singleton;
import java.util.Collections;

import static org.mockito.Matchers.any;

/**
* @author Geoffroy Jamgotchian <geoffroy.jamgotchian at rte-france.com>
*/
Expand All @@ -36,5 +39,7 @@ public void init() {
.thenReturn(storage);
Mockito.when(appData.getRemotelyAccessibleFileSystemNames())
.thenReturn(Collections.singletonList(TEST_FS_NAME));
AppFileSystem appFileSystem = new AppFileSystem(TEST_FS_NAME, true, storage);
Mockito.when(appData.getFileSystem(any())).thenReturn(appFileSystem);
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -6,12 +6,19 @@
*/
package com.powsybl.afs.ws.server;

import com.powsybl.afs.Folder;
import com.powsybl.afs.Project;
import com.powsybl.afs.TaskMonitor;
import com.powsybl.afs.storage.AbstractAppStorageTest;
import com.powsybl.afs.storage.ListenableAppStorage;
import com.powsybl.afs.storage.NodeGenericMetadata;
import com.powsybl.afs.storage.NodeInfo;
import com.powsybl.afs.ws.client.utils.ClientUtils;
import com.powsybl.afs.ws.client.utils.UserSession;
import com.powsybl.afs.ws.server.utils.AppDataBean;
import com.powsybl.afs.ws.storage.RemoteAppStorage;
import com.powsybl.afs.ws.storage.RemoteListenableAppStorage;
import com.powsybl.afs.ws.storage.RemoteTaskMonitor;
import com.powsybl.commons.exceptions.UncheckedUriSyntaxException;
import org.jboss.arquillian.container.test.api.Deployment;
import org.jboss.arquillian.container.test.api.RunAsClient;
Expand All @@ -23,15 +30,18 @@
import org.jboss.shrinkwrap.resolver.api.maven.Maven;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.mockito.Mockito;

import javax.inject.Inject;
import java.io.File;
import java.net.URI;
import java.net.URISyntaxException;
import java.net.URL;
import java.util.Collections;
import java.util.List;

import static org.junit.Assert.assertEquals;
import static org.junit.Assert.*;
import static org.mockito.Mockito.when;

/**
* @author Ali Tahanout <ali.tahanout at rte-france.com>
Expand All @@ -46,19 +56,22 @@ public class AppStorageServerTest extends AbstractAppStorageTest {

private UserSession userSession;

@Inject
private AppDataBean appDataBean;

@Deployment
public static WebArchive createTestArchive() {
File[] filesLib = Maven.configureResolver()
.useLegacyLocalRepo(true)
.withMavenCentralRepo(false)
.withClassPathResolution(true)
.loadPomFromFile("pom.xml")
.importRuntimeDependencies()
.resolve("org.mockito:mockito-all",
"com.powsybl:powsybl-config-test",
"com.powsybl:powsybl-afs-mapdb")
.withTransitivity()
.asFile();
.useLegacyLocalRepo(true)
.withMavenCentralRepo(false)
.withClassPathResolution(true)
.loadPomFromFile("pom.xml")
.importRuntimeDependencies()
.resolve("org.mockito:mockito-all",
"com.powsybl:powsybl-config-test",
"com.powsybl:powsybl-afs-mapdb")
.withTransitivity()
.asFile();

return ShrinkWrap.create(WebArchive.class, "afs-ws-server-test.war")
.addAsWebInfResource(EmptyAsset.INSTANCE, "beans.xml")
Expand Down Expand Up @@ -92,4 +105,22 @@ public void getFileSystemNamesTest() {
List<String> fileSystemNames = RemoteAppStorage.getFileSystemNames(getRestUri(), userSession.getToken());
assertEquals(Collections.singletonList(AppDataBeanMock.TEST_FS_NAME), fileSystemNames);
}

@Test
public void createTaskRemoteTest() {
RemoteTaskMonitor taskMonitor = new RemoteTaskMonitor(AppDataBeanMock.TEST_FS_NAME, getRestUri(), userSession.getToken());
NodeInfo root = storage.createRootNodeIfNotExists(storage.getFileSystemName(), Folder.PSEUDO_CLASS);
NodeInfo projectNode = storage.createNode(root.getId(), "project", Project.PSEUDO_CLASS, "test project", 0, new NodeGenericMetadata());

Project project = Mockito.mock(Project.class);
when(project.getId()).thenReturn(projectNode.getId());
TaskMonitor.Task task = taskMonitor.startTask("task_test", project);
assertNotNull(task);
TaskMonitor.Snapshot snapshot = taskMonitor.takeSnapshot(project.getId());
assertTrue(snapshot.getTasks().stream().anyMatch(t -> t.getId().equals(task.getId())));

// cleanup
storage.deleteNode(projectNode.getId());
}

}
Original file line number Diff line number Diff line change
Expand Up @@ -9,9 +9,12 @@
import com.powsybl.afs.ws.server.utils.UserAuthenticator;
import com.powsybl.commons.net.UserProfile;

import javax.inject.Named;

/**
* @author Geoffroy Jamgotchian <geoffroy.jamgotchian at rte-france.com>
*/
@Named
public class UserAuthenticatorMock implements UserAuthenticator {

@Override
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,7 @@
*/
package com.powsybl.afs.ws.storage;

import com.powsybl.afs.Project;
import com.powsybl.afs.ProjectFile;
import com.powsybl.afs.TaskListener;
import com.powsybl.afs.TaskMonitor;
Expand Down Expand Up @@ -89,6 +90,27 @@ public Task startTask(ProjectFile projectFile) {
}
}

@Override
public Task startTask(String name, Project project) {
Objects.requireNonNull(name);
Objects.requireNonNull(project);

LOGGER.debug("startTask(fileSystemName={}, name={}, project={})", fileSystemName, name, project.getId());

Response response = webTarget.path("fileSystems/{fileSystemName}/tasks")
.resolveTemplate(FILE_SYSTEM_NAME, fileSystemName)
.queryParam("name", project.getId())
.queryParam("projectId", project.getId())
.request(MediaType.APPLICATION_JSON)
.header(HttpHeaders.AUTHORIZATION, token)
.put(Entity.text(""));
try {
return readEntityIfOk(response, TaskMonitor.Task.class);
} finally {
response.close();
}
}

@Override
public void stopTask(UUID id) {
LOGGER.debug("stopTask(fileSystemName={}, id={})", fileSystemName, id);
Expand Down

0 comments on commit a96f59d

Please sign in to comment.