Skip to content

Commit

Permalink
Browse files Browse the repository at this point in the history
  • Loading branch information
fabrizzio-dotCMS committed Jun 6, 2023
1 parent f0fea21 commit e0494d5
Show file tree
Hide file tree
Showing 6 changed files with 207 additions and 36 deletions.
Original file line number Diff line number Diff line change
@@ -0,0 +1,14 @@
package com.dotcms.rest.api.v1.asset;


import com.fasterxml.jackson.databind.annotation.JsonDeserialize;
import org.immutables.value.Value;

@Value.Style(typeImmutable="*", typeAbstract="Abstract*")
@Value.Immutable
@JsonDeserialize(as = FileUploadParamsJson.Builder.class)
public interface AbstractFileUploadParamsJson {

String id();

}
Original file line number Diff line number Diff line change
@@ -0,0 +1,52 @@
package com.dotcms.rest.api.v1.asset;

import java.io.InputStream;
import org.glassfish.jersey.media.multipart.FormDataContentDisposition;
import org.glassfish.jersey.media.multipart.FormDataParam;

public class FileUploadData {

@FormDataParam("file")
private InputStream fileInputStream;

@FormDataParam("file")
private FormDataContentDisposition contentDisposition;

@FormDataParam("assetPath")
private String assetPath;

@FormDataParam("detail")
private FileUploadDetail detail;

public InputStream getFileInputStream() {
return fileInputStream;
}

public void setFileInputStream(InputStream fileInputStream) {
this.fileInputStream = fileInputStream;
}

public FormDataContentDisposition getContentDisposition() {
return contentDisposition;
}

public void setContentDisposition(FormDataContentDisposition contentDisposition) {
this.contentDisposition = contentDisposition;
}

public String getAssetPath() {
return assetPath;
}

public void setAssetPath(String assetPath) {
this.assetPath = assetPath;
}

public FileUploadDetail getDetail() {
return detail;
}

public void setDetail(FileUploadDetail detail) {
this.detail = detail;
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,62 @@
package com.dotcms.rest.api.v1.asset;

import com.fasterxml.jackson.annotation.JsonCreator;
import com.fasterxml.jackson.annotation.JsonProperty;

public class FileUploadDetail {

@JsonCreator
public FileUploadDetail(@JsonProperty("assetPath") final String assetPath,
@JsonProperty("language") final String language,
@JsonProperty("status") final String status,
@JsonProperty("createNewVersion") final Boolean createNewVersion) {
this.assetPath = assetPath;
this.language = language;
this.status = status;
this.createNewVersion = createNewVersion;
}

@JsonProperty("assetPath")
private String assetPath;

@JsonProperty("language")
private String language;

@JsonProperty("status")
private String status;

@JsonProperty("createNewVersion")
private Boolean createNewVersion;

public String getAssetPath() {
return assetPath;
}

public void setAssetPath(String assetPath) {
this.assetPath = assetPath;
}

public String getLanguage() {
return language;
}

public void setLanguage(String language) {
this.language = language;
}

public String getStatus() {
return status;
}

public void setStatus(String status) {
this.status = status;
}

public Boolean getCreateNewVersion() {
return createNewVersion;
}

public void setCreateNewVersion(Boolean createNewVersion) {
this.createNewVersion = createNewVersion;
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -20,20 +20,21 @@
import com.dotmarketing.portlets.folders.model.Folder;
import com.dotmarketing.portlets.languagesmanager.business.LanguageAPI;
import com.dotmarketing.portlets.languagesmanager.model.Language;
import com.dotmarketing.portlets.structure.model.ContentletRelationships;
import com.dotmarketing.util.Logger;
import com.liferay.portal.model.User;
import io.vavr.control.Try;
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.Serializable;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.StandardCopyOption;
import java.util.List;
import java.util.Map;
import java.util.Optional;
import java.util.stream.Collectors;
import org.glassfish.jersey.media.multipart.FormDataContentDisposition;

/**
* In typical dotCMS resource fashion this class is responsible for undertaking the heavy lifting
Expand Down Expand Up @@ -249,43 +250,91 @@ FolderView toAssetsFolder(final Folder folder) {
.build();
}

public void createOrReplaceAsset(final String rawPath, final String fileName, final InputStream fileInputStream, final User user)
public WebAssetView saveOrUpdateAsset(FileUploadData form, final User user)
throws DotDataException, DotSecurityException, IOException {

final FormDataContentDisposition contentDisposition = form.getContentDisposition();
final String fileName = contentDisposition.getFileName();
final InputStream fileInputStream = form.getFileInputStream();
final FileUploadDetail detail = form.getDetail();
final String assetPath = detail.getAssetPath();
final ResolvedAssetAndPath assetAndPath = AssetPathResolver.newInstance()
.resolve(rawPath, user, true);
.resolve(assetPath, user, true);

final Host host = assetAndPath.resolvedHost();
final Folder folder = assetAndPath.resolvedFolder();
final String assetName = assetAndPath.asset();
final String assetName = fileName != null ? fileName : assetAndPath.asset();

System.out.println(host);
System.out.println(folder);
System.out.println(assetName);

if(null != fileInputStream) {
//TODO validate size length
if(null == fileInputStream) {
return toAssetsFolder(folder);
}
//TODO validate size length so we dont get out of memory by a malicious user

final Path tempFile = Files.createTempFile(assetName, "temp");

Files.copy(fileInputStream, tempFile);

final Contentlet contentlet = makeFileAsset(tempFile, folder);
final Contentlet savedContentlet = contentletAPI.checkin(contentlet, user, false);
final Builder builder = BrowserQuery.builder();
builder.showDotAssets(false)
.withUser(user)
.showFiles(true)
.showFolders(true)
.showArchived(false)
.showWorking(true)
.showLinks(false)
.showDotAssets(false)
.showImages(true)
.showContent(true);

if(folder.isSystemFolder()){
builder.withHostOrFolderId(host.getIdentifier());
} else {
builder.withHostOrFolderId(folder.getInode());
}

builder.withFilter(assetName);
final List<Treeable> folderContent = browserAPI.getFolderContentList(builder.build());
final List<Treeable> assets = folderContent.stream()
.filter(Contentlet.class::isInstance).collect(Collectors.toList());

Contentlet savedAsset = null;

if(assets.isEmpty()){
//The file does not exist
final Contentlet contentlet = makeFileAsset(tempFile, folder);
savedAsset = contentletAPI.checkin(contentlet, user, false);
} else {
final Optional<Treeable> first = assets.stream().findFirst();
final Contentlet asset = (Contentlet) first.get();
updateFileAsset(tempFile, folder, asset);
savedAsset = contentletAPI.checkinWithoutVersioning(asset,
(ContentletRelationships) null, null, null,
APILocator.systemUser(), false);
}

final FileAsset fileAsset = fileAssetAPI.fromContentlet(savedAsset);
return toAsset(fileAsset);
}

}



Contentlet makeFileAsset(final Path filePath, final Folder folder){
final Contentlet contentlet = new Contentlet();
return updateFileAsset(filePath, folder, contentlet);
}

Contentlet makeFileAsset(final Path filePath, final Folder folder){
final File file = filePath.toFile();
final Contentlet contentlet = new Contentlet();
final String fileName = file.getName();
contentlet.setProperty(FileAssetAPI.TITLE_FIELD, fileName);
contentlet.setProperty(FileAssetAPI.FILE_NAME_FIELD, fileName);
contentlet.setProperty(FileAssetAPI.BINARY_FIELD, file);
contentlet.setFolder(folder.getInode());
return contentlet;
}

Contentlet updateFileAsset(final Path filePath, final Folder folder, final Contentlet contentlet){
final File file = filePath.toFile();
final String fileName = file.getName();
contentlet.setProperty(FileAssetAPI.TITLE_FIELD, fileName);
contentlet.setProperty(FileAssetAPI.FILE_NAME_FIELD, fileName);
contentlet.setProperty(FileAssetAPI.BINARY_FIELD, file);
contentlet.setFolder(folder.getInode());
return contentlet;
}



Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -9,20 +9,18 @@
import com.dotmarketing.exception.DotSecurityException;
import com.dotmarketing.util.Logger;
import com.liferay.portal.model.User;
import java.io.InputStream;
import java.io.IOException;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.ws.rs.BeanParam;
import javax.ws.rs.Consumes;
import javax.ws.rs.FormParam;
import javax.ws.rs.POST;
import javax.ws.rs.PUT;
import javax.ws.rs.Path;
import javax.ws.rs.Produces;
import javax.ws.rs.core.Context;
import javax.ws.rs.core.MediaType;
import javax.ws.rs.core.Response;
import org.glassfish.jersey.media.multipart.FormDataContentDisposition;
import org.glassfish.jersey.media.multipart.FormDataParam;
import org.glassfish.jersey.server.JSONP;

/**
Expand Down Expand Up @@ -69,10 +67,8 @@ public Response getAssetsInfo(@Context final HttpServletRequest request,
public Response putAsset(
@Context final HttpServletRequest request,
@Context final HttpServletResponse response,
@FormDataParam("file") InputStream fileInputStream,
@FormDataParam("file") FormDataContentDisposition contentDispositionHeader,
@FormDataParam("assetPath") String assetPath
) throws DotSecurityException, DotDataException {
@BeanParam FileUploadData form
) throws DotSecurityException, DotDataException, IOException {

final InitDataObject initDataObject = new WebResource.InitBuilder()
.requiredBackendUser(true)
Expand All @@ -81,12 +77,10 @@ public Response putAsset(
.rejectWhenNoUser(true).init();

final User user = initDataObject.getUser();
final String fileName = contentDispositionHeader == null ? null : contentDispositionHeader.getFileName();
helper.createOrReplaceAsset(assetPath, fileName, fileInputStream, user);

final WebAssetView webAssetView = helper.saveOrUpdateAsset(form, user);
//Logger.info(this, String.format("User [%s] is requesting assets info for path [%s]", user.getUserId(), form.assetPath()));

return Response.ok(new WebAssetEntityView(null)).build();
return Response.ok(new WebAssetEntityView(webAssetView)).build();
}

}
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,7 @@
@Value.Style(typeImmutable="*", typeAbstract="Abstract*")
@Value.Immutable
@JsonDeserialize(as = AssetView.Builder.class)
public interface AbstractAssetView {
public interface AbstractAssetView extends WebAssetView {

String name();
String identifier();
Expand Down

0 comments on commit e0494d5

Please sign in to comment.