Skip to content

Commit

Permalink
Decoupled most core classes from FsProjectStorage
Browse files Browse the repository at this point in the history
Fixes #278,#291
  • Loading branch information
otsakir committed Jan 25, 2018
1 parent 714b9b9 commit 40222f9
Show file tree
Hide file tree
Showing 14 changed files with 202 additions and 252 deletions.
23 changes: 7 additions & 16 deletions designer/src/main/java/org/restcomm/connect/rvd/BuildService.java
Expand Up @@ -26,8 +26,7 @@
import org.restcomm.connect.rvd.model.project.Step;
import org.restcomm.connect.rvd.model.server.NodeName;
import org.restcomm.connect.rvd.model.server.ProjectIndex;
import org.restcomm.connect.rvd.storage.FsProjectStorage;
import org.restcomm.connect.rvd.storage.WorkspaceStorage;
import org.restcomm.connect.rvd.storage.ProjectDao;
import org.restcomm.connect.rvd.storage.exceptions.StorageException;

import com.google.gson.Gson;
Expand All @@ -42,10 +41,10 @@
public class BuildService {

protected Gson gson;
private WorkspaceStorage workspaceStorage;
private ProjectDao projectDao;

public BuildService(WorkspaceStorage workspaceStorage) {
this.workspaceStorage = workspaceStorage;
public BuildService(ProjectDao projectDao) {
this.projectDao = projectDao;
// Parse the big project state object into a nice dto model
gson = new GsonBuilder()
.registerTypeAdapter(Step.class, new StepJsonDeserializer())
Expand Down Expand Up @@ -77,24 +76,16 @@ public void buildProject(String projectName, ProjectState projectState) throws S
}

projectOptions.setDefaultTarget(projectState.getHeader().getStartNodeName());
//if ( projectState.getHeader().getLogging() != null )
// projectOptions.setLogging(true);
// Save the nodename-node-label mapping
FsProjectStorage.storeProjectOptions(projectOptions, projectName, workspaceStorage);
projectDao.storeProjectOptions(projectName, projectOptions);
}

public void buildProject(String projectName) throws StorageException {
ProjectState state = FsProjectStorage.loadProject(projectName, workspaceStorage);
ProjectState state = projectDao.loadProject(projectName);
buildProject(projectName, state);
}

private void buildNode(Node node, String projectName) throws StorageException {
// TODO sanitize node name!
FsProjectStorage.storeNode(node,projectName,workspaceStorage);
// FsProjectStorage.storeNodeStepnames(node, projectName, workspaceStorage);
// // process the steps one-by-one
// for (Step step : node.getSteps()) {
// FsProjectStorage.storeNodeStep(step, node, projectName, workspaceStorage);
// }
projectDao.storeNode(projectName, node);
}
}
Expand Up @@ -21,8 +21,6 @@
package org.restcomm.connect.rvd.helpers;

import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.IOException;
import java.io.InputStream;
Expand All @@ -33,13 +31,11 @@
import com.google.gson.Gson;
import com.google.gson.JsonSyntaxException;
import org.apache.commons.io.FileUtils;
import org.restcomm.connect.rvd.BuildService;
import org.restcomm.connect.rvd.RvdConfiguration;
import org.restcomm.connect.rvd.RvdContext;
import org.restcomm.connect.rvd.exceptions.InvalidServiceParameters;
import org.restcomm.connect.rvd.exceptions.ProjectDoesNotExist;
import org.restcomm.connect.rvd.exceptions.RvdException;
import org.restcomm.connect.rvd.exceptions.StreamDoesNotFitInFile;
import org.restcomm.connect.rvd.exceptions.project.UnsupportedProjectVersion;
import org.restcomm.connect.rvd.jsonvalidation.ProjectValidator;
import org.restcomm.connect.rvd.jsonvalidation.ValidationErrorItem;
Expand All @@ -51,16 +47,12 @@
import org.restcomm.connect.rvd.model.project.ProjectState;
import org.restcomm.connect.rvd.model.project.StateHeader;
import org.restcomm.connect.rvd.model.project.Step;
import org.restcomm.connect.rvd.model.client.WavItem;
import org.restcomm.connect.rvd.model.project.RvdProject;
import org.restcomm.connect.rvd.storage.FsProjectDao;
import org.restcomm.connect.rvd.storage.FsProjectStorage;
import org.restcomm.connect.rvd.storage.ProjectDao;
import org.restcomm.connect.rvd.storage.WorkspaceStorage;
import org.restcomm.connect.rvd.storage.exceptions.BadProjectHeader;
import org.restcomm.connect.rvd.storage.exceptions.ProjectAlreadyExists;
import org.restcomm.connect.rvd.storage.exceptions.StorageException;
import org.restcomm.connect.rvd.storage.exceptions.WavItemDoesNotExist;
import org.restcomm.connect.rvd.upgrade.UpgradeService;
import org.restcomm.connect.rvd.upgrade.UpgradeService.UpgradabilityStatus;
import org.restcomm.connect.rvd.utils.RvdUtils;
Expand All @@ -74,8 +66,6 @@
import com.github.fge.jsonschema.core.exceptions.ProcessingException;
import com.google.gson.JsonElement;
import com.google.gson.JsonParser;
import org.restcomm.connect.rvd.utils.Zipper;
import org.restcomm.connect.rvd.utils.exceptions.ZipperException;

public class ProjectHelper {

Expand Down Expand Up @@ -220,7 +210,7 @@ public void updateProject(HttpServletRequest request, String projectName, Projec
}

public void importProjectFromRawArchive(InputStream archiveStream, String applicationSid, String owner) throws RvdException {
File archiveFile = new File(applicationSid);
File archiveFile = new File(applicationSid); // TODO these two lines should probably be removed
String projectName = FilenameUtils.getBaseName(archiveFile.getName());

// First unzip to temp dir
Expand Down Expand Up @@ -251,22 +241,16 @@ public String importProject(File tempProjectDir, String suggestedName, String ow
if ( UpgradeService.checkUpgradability(version, RvdConfiguration.RVD_PROJECT_VERSION) == UpgradeService.UpgradabilityStatus.UPGRADABLE ) {
UpgradeService upgradeService = new UpgradeService(tempStorage);
upgradeService.upgradeProject(tempProjectDir.getName());
BuildService buildService = new BuildService(tempStorage);
buildService.buildProject(tempProjectDir.getName());
} else {
// project cannot be upgraded
throw new UnsupportedProjectVersion("Imported project version (" + version + ") not supported");
}
}
// project is either compatible or was upgraded
ProjectDao tempProjectDao = new FsProjectDao(tempStorage); // this will always happen on the filesystem regardless of implementation of the actual workspace
ProjectState state = tempProjectDao.loadProject(tempProjectDir.getName());
state.getHeader().setOwner(owner);
projectDao.updateProjectState(tempProjectDir.getName(), state);

if ( projectDao.projectExists(suggestedName) )
throw new ProjectAlreadyExists("Project '" + suggestedName + "' already exists");
projectDao.createProjectFromLocation(suggestedName, tempProjectDir.getName(), owner );
projectDao.createProjectFromLocation(suggestedName, tempProjectDir.getPath(), owner );

return suggestedName;
} catch ( UnsupportedProjectVersion e) {
Expand All @@ -278,14 +262,6 @@ public String importProject(File tempProjectDir, String suggestedName, String ow
}
}

public List<WavItem> getWavs(String appName) throws StorageException {
return FsProjectStorage.listWavs(appName, workspaceStorage);
}

public void removeWavFromProject(String projectName, String wavName) throws WavItemDoesNotExist {
FsProjectStorage.deleteWav(projectName, wavName,workspaceStorage);
}

/**
* Loads the project specified into an rvd project object
* @param projectName
Expand Down
Expand Up @@ -88,7 +88,6 @@
import org.restcomm.connect.rvd.project.ProjectKind;
import org.restcomm.connect.rvd.project.ProjectUtils;
import org.restcomm.connect.rvd.storage.FsProjectDao;
import org.restcomm.connect.rvd.storage.FsProjectStorage;
import org.restcomm.connect.rvd.storage.FsProjectTemplateDao;
import org.restcomm.connect.rvd.storage.ProjectDao;
import org.restcomm.connect.rvd.storage.ProjectTemplateDao;
Expand Down Expand Up @@ -250,7 +249,7 @@ Response createProjectFromTemplate(String templateId, String projectName) throws
upgradeService.upgradeProject(applicationId);
// build project too
ProjectState projectState = projectDao.loadProject(applicationId);
BuildService buildService = new BuildService(workspaceStorage);
BuildService buildService = new BuildService(projectDao);
buildService.buildProject(applicationId, projectState);
// prepare response
ProjectCreatedDto dto = new ProjectCreatedDto(projectName, applicationId, kind);
Expand All @@ -271,7 +270,7 @@ Response createProjectFromScratch(String projectName, String kind) {
ProjectState projectState = projectService.createProjectObject(applicationSid, kind, getLoggedUsername());
ProjectDao projectDao = buildProjectDao(workspaceStorage);
projectDao.createProject(applicationSid, projectState);
BuildService buildService = new BuildService(workspaceStorage);
BuildService buildService = new BuildService(projectDao );
buildService.buildProject(applicationSid, projectState);

} catch (ProjectAlreadyExists e) {
Expand Down Expand Up @@ -344,10 +343,11 @@ Response createProjectFromArchive(HttpServletRequest request, String projectName
if (filesCounted == 1 && projectName != null) {
effectiveProjectName = projectName;
}
// buildService.buildProject(effectiveProjectName);
ProjectDao projectDao = buildProjectDao(workspaceStorage);
BuildService buildService = new BuildService(projectDao);
buildService.buildProject(applicationSid);

// Load project kind
ProjectDao projectDao = buildProjectDao(workspaceStorage);
String projectString = projectDao.loadProjectStateRaw(applicationSid);
ProjectState state = marshaler.toModel(projectString, ProjectState.class);
String projectKind = state.getHeader().getProjectKind();
Expand Down Expand Up @@ -541,12 +541,13 @@ public Response upgradeProject(@PathParam("applicationSid") String applicationSi
// TODO IMPORTANT!!! sanitize the project name!!
if (!RvdUtils.isEmpty(applicationSid)) {
try {
ProjectDao projectDao = buildProjectDao(workspaceStorage);
UpgradeService upgradeService = new UpgradeService(workspaceStorage);
upgradeService.upgradeProject(applicationSid);
if (RvdLoggers.local.isEnabledFor(Level.INFO))
RvdLoggers.local.log(Level.INFO, LoggingHelper.buildMessage(getClass(), "upgradeProject","{0} project {1} upgraded to version {2}", new Object[] {logging.getPrefix(), applicationSid, RvdConfiguration.RVD_PROJECT_VERSION }));
// re-build project
BuildService buildService = new BuildService(workspaceStorage);
BuildService buildService = new BuildService(projectDao);
buildService.buildProject(applicationSid, activeProject);
if (RvdLoggers.local.isEnabledFor(Level.INFO))
RvdLoggers.local.log(Level.INFO, LoggingHelper.buildMessage(getClass(),"upgradeProject",logging.getPrefix(), "project " + applicationSid + " built"));
Expand Down Expand Up @@ -673,7 +674,7 @@ public Response uploadWavFile(@PathParam("applicationSid") String applicationSid
return Response.status(Status.BAD_REQUEST).entity("{\"error\":\"FILE_EXT_NOT_ALLOWED\"}").build();
}
try {
projectDao.storeWav(applicationSid,filename, item.openStream(),configuration.getMaxMediaFileSize());
projectDao.storeMediaFromStream(applicationSid,filename, item.openStream(),configuration.getMaxMediaFileSize());
} catch (StreamDoesNotFitInFile e) {
// Oops, the uploaded file is too big. Back off..
Integer maxSize = rvdContext.getConfiguration().getMaxMediaFileSize();
Expand Down Expand Up @@ -715,7 +716,7 @@ public Response removeWavFile(@PathParam("applicationSid") String applicationSid
ProjectDao projectDao = buildProjectDao(workspaceStorage);
assertProjectStateAvailable(applicationSid, projectDao);
try {
projectService.removeWavFromProject(applicationSid, wavname);
projectDao.removeMedia(applicationSid, wavname);
return Response.ok().build();
} catch (WavItemDoesNotExist e) {
if (RvdLoggers.local.isEnabledFor(Level.INFO))
Expand All @@ -733,8 +734,7 @@ public Response listWavs(@PathParam("applicationSid") String applicationSid) thr
assertProjectStateAvailable(applicationSid, projectDao);
List<WavItem> items;
try {

items = projectService.getWavs(applicationSid);
items = projectDao.listMedia(applicationSid);
Gson gson = new Gson();
return Response.ok(gson.toJson(items), MediaType.APPLICATION_JSON).build();
} catch (BadWorkspaceDirectoryStructure e) {
Expand All @@ -747,7 +747,7 @@ public Response listWavs(@PathParam("applicationSid") String applicationSid) thr
}

/*
* Return a media file from the project. It's the same as getWav() but it has the Query parameters converted to Path
* Return a media file from the project. It's the same as getMediaAsStream() but it has the Query parameters converted to Path
* parameters
*/
@GET
Expand All @@ -756,7 +756,8 @@ public Response getWavNoQueryParams(@PathParam("applicationSid") String applicat
@PathParam("filename") String filename, @PathParam("ext") String extension) {
InputStream wavStream;
try {
wavStream = FsProjectStorage.getWav(applicationSid, filename + "." + extension, workspaceStorage);
ProjectDao projectDao = buildProjectDao(workspaceStorage);
wavStream = projectDao.getMediaAsStream(applicationSid, filename + "." + extension);
String mediaType;
if ( "mp4".equals(extension))
mediaType = "video/mp4";
Expand All @@ -781,7 +782,7 @@ public Response buildProject(@PathParam("applicationSid") String applicationSid)
secure();
ProjectDao projectDao = buildProjectDao(workspaceStorage);
assertProjectStateAvailable(applicationSid, projectDao);
BuildService buildService = new BuildService(workspaceStorage);
BuildService buildService = new BuildService(projectDao);
try {
buildService.buildProject(applicationSid, activeProject);
return Response.ok().build();
Expand Down
Expand Up @@ -66,7 +66,6 @@
import org.restcomm.connect.rvd.storage.FsProfileDao;
import org.restcomm.connect.rvd.storage.FsProjectDao;
import org.restcomm.connect.rvd.storage.ProfileDao;
import org.restcomm.connect.rvd.storage.FsProjectStorage;
import org.restcomm.connect.rvd.storage.ProjectDao;
import org.restcomm.connect.rvd.storage.WorkspaceStorage;
import org.restcomm.connect.rvd.storage.exceptions.StorageException;
Expand Down Expand Up @@ -200,13 +199,13 @@ public Response controllerPost(@Context HttpServletRequest httpRequest, Multival
public Response getWav(@PathParam("filename") String filename) {
InputStream wavStream;
try {
wavStream = FsProjectStorage.getWav(applicationId, filename, workspaceStorage);
wavStream = projectDao.getMediaAsStream(applicationId, filename);
return Response.ok(wavStream, "audio/x-wav")
.header("Content-Disposition", "attachment; filename = " + filename).build();
} catch (WavItemDoesNotExist e) {
return Response.status(Status.NOT_FOUND).build(); // ordinary error page is returned since this will be consumed // either from restcomm or directly from user
} catch (StorageException e) {
RvdLoggers.local.log(Level.ERROR, LoggingHelper.buildMessage(getClass(),"getWav", logging.getPrefix(), e.getMessage()), e);
RvdLoggers.local.log(Level.ERROR, LoggingHelper.buildMessage(getClass(),"getMediaAsStream", logging.getPrefix(), e.getMessage()), e);
return Response.status(Status.INTERNAL_SERVER_ERROR).build(); // ordinary error page is returned since this will
// be consumed either from restcomm or directly
// from user
Expand Down

0 comments on commit 40222f9

Please sign in to comment.