Cleanup file streaming utilities (#559)

* Cleanup file streaming.

Signed-off-by: kaizimmerm <kai.zimmermann@bosch-si.com>

* Added missing comments.

Signed-off-by: kaizimmerm <kai.zimmermann@bosch-si.com>

* Fix typo.

Signed-off-by: kaizimmerm <kai.zimmermann@bosch-si.com>

* Split utility class.

Signed-off-by: kaizimmerm <kai.zimmermann@bosch-si.com>

* Dependency cleanup.

Signed-off-by: kaizimmerm <kai.zimmermann@bosch-si.com>

* Add missing dependency,

Signed-off-by: kaizimmerm <kai.zimmermann@bosch-si.com>

* Remove repository api dependency from rest core.

Signed-off-by: kaizimmerm <kai.zimmermann@bosch-si.com>

* Fix build and sonar issues.

Signed-off-by: kaizimmerm <kai.zimmermann@bosch-si.com>

* Remove custom ConstraintViolationException

Signed-off-by: kaizimmerm <kai.zimmermann@bosch-si.com>

* RequestMapping should be public.

Signed-off-by: kaizimmerm <kai.zimmermann@bosch-si.com>

* Fix errors.

Signed-off-by: kaizimmerm <kai.zimmermann@bosch-si.com>

* Removed dead code.

Signed-off-by: kaizimmerm <kai.zimmermann@bosch-si.com>

* Not null

Signed-off-by: kaizimmerm <kai.zimmermann@bosch-si.com>

* Fix nullpointer.

Signed-off-by: kaizimmerm <kai.zimmermann@bosch-si.com>

* Code cleanup.

Signed-off-by: kaizimmerm <kai.zimmermann@bosch-si.com>
This commit is contained in:
Kai Zimmermann
2017-07-19 12:43:07 +02:00
committed by GitHub
parent 66feae2756
commit 09b24fa97d
59 changed files with 911 additions and 908 deletions

View File

@@ -14,19 +14,24 @@ import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.InputStream;
import org.eclipse.hawkbit.artifact.repository.model.DbArtifact;
import org.eclipse.hawkbit.artifact.repository.model.AbstractDbArtifact;
import org.eclipse.hawkbit.artifact.repository.model.DbArtifactHash;
import org.springframework.util.Assert;
import com.google.common.base.Throwables;
/**
* A {@link DbArtifact} implementation which dynamically creates a
* {@link AbstractDbArtifact} implementation which dynamically creates a
* {@link FileInputStream} on calling {@link #getFileInputStream()}.
*/
public class ArtifactFilesystem extends DbArtifact {
public class ArtifactFilesystem extends AbstractDbArtifact {
private final File file;
ArtifactFilesystem(final File file) {
public ArtifactFilesystem(final File file, final String artifactId, final DbArtifactHash hashes, final Long size,
final String contentType) {
super(artifactId, hashes, size, contentType);
Assert.notNull(file, "File cannot be null");
this.file = file;
}

View File

@@ -22,7 +22,7 @@ import java.security.NoSuchAlgorithmException;
import java.util.List;
import org.apache.commons.io.FileUtils;
import org.eclipse.hawkbit.artifact.repository.model.DbArtifact;
import org.eclipse.hawkbit.artifact.repository.model.AbstractDbArtifact;
import org.eclipse.hawkbit.artifact.repository.model.DbArtifactHash;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
@@ -88,7 +88,7 @@ public class ArtifactFilesystemRepository implements ArtifactRepository {
}
final File file = createTempFile();
final DbArtifact artifact = store(content, contentType, hash, mdSHA1, mdMD5, file);
final AbstractDbArtifact artifact = store(content, contentType, hash, mdSHA1, mdMD5, file);
return renameFileToSHA1Naming(tenant, file, artifact);
}
@@ -103,25 +103,22 @@ public class ArtifactFilesystemRepository implements ArtifactRepository {
if (!file.exists()) {
return null;
}
final ArtifactFilesystem artifact = new ArtifactFilesystem(file);
artifact.setArtifactId(sha1);
artifact.setHashes(new DbArtifactHash(sha1, null));
artifact.setSize(file.length());
return artifact;
return new ArtifactFilesystem(file, sha1, new DbArtifactHash(sha1, null), file.length(), null);
}
private DbArtifact store(final InputStream content, final String contentType, final DbArtifactHash hash,
private AbstractDbArtifact store(final InputStream content, final String contentType, final DbArtifactHash hash,
final MessageDigest mdSHA1, final MessageDigest mdMD5, final File file) {
final DbArtifact artifact = new DbArtifact();
AbstractDbArtifact artifact;
try (final DigestOutputStream outputstream = openFileOutputStream(file, mdSHA1, mdMD5)) {
final long artifactSize = ByteStreams.copy(content, outputstream);
outputstream.flush();
final String sha1Hash = BaseEncoding.base16().lowerCase().encode(mdSHA1.digest());
final String md5Hash = BaseEncoding.base16().lowerCase().encode(mdMD5.digest());
artifact.setArtifactId(sha1Hash);
artifact.setSize(artifactSize);
artifact.setContentType(contentType);
artifact.setHashes(new DbArtifactHash(sha1Hash, md5Hash));
artifact = new ArtifactFilesystem(file, sha1Hash, new DbArtifactHash(sha1Hash, md5Hash), artifactSize,
contentType);
checkHashes(artifact, hash);
} catch (final IOException e) {
throw new ArtifactStoreException(e.getMessage(), e);
@@ -134,9 +131,11 @@ public class ArtifactFilesystemRepository implements ArtifactRepository {
return artifact;
}
private ArtifactFilesystem renameFileToSHA1Naming(final String tenant, final File file, final DbArtifact artifact) {
private ArtifactFilesystem renameFileToSHA1Naming(final String tenant, final File file,
final AbstractDbArtifact artifact) {
final File fileSHA1Naming = getFile(tenant, artifact.getHashes().getSha1());
final ArtifactFilesystem fileSystemArtifact = new ArtifactFilesystem(fileSHA1Naming);
final ArtifactFilesystem fileSystemArtifact = new ArtifactFilesystem(fileSHA1Naming, artifact.getArtifactId(),
artifact.getHashes(), artifact.getSize(), artifact.getContentType());
if (fileSHA1Naming.exists()) {
FileUtils.deleteQuietly(file);
} else {
@@ -150,14 +149,11 @@ public class ArtifactFilesystemRepository implements ArtifactRepository {
if (!file.delete()) {
LOG.debug("Could not delete temp file {}", file);
}
fileSystemArtifact.setArtifactId(artifact.getArtifactId());
fileSystemArtifact.setContentType(artifact.getContentType());
fileSystemArtifact.setHashes(artifact.getHashes());
fileSystemArtifact.setSize(artifact.getSize());
return fileSystemArtifact;
}
private DbArtifact checkHashes(final DbArtifact artifact, final DbArtifactHash hash) {
private AbstractDbArtifact checkHashes(final AbstractDbArtifact artifact, final DbArtifactHash hash) {
if (hash == null) {
return artifact;
}

View File

@@ -16,7 +16,7 @@ import java.util.Random;
import org.apache.commons.io.IOUtils;
import org.assertj.core.api.Assertions;
import org.eclipse.hawkbit.artifact.repository.model.DbArtifact;
import org.eclipse.hawkbit.artifact.repository.model.AbstractDbArtifact;
import org.junit.Test;
import ru.yandex.qatools.allure.annotations.Description;
@@ -52,7 +52,7 @@ public class ArtifactFilesystemRepositoryTest {
final byte[] fileContent = randomBytes();
final ArtifactFilesystem artifact = storeRandomArtifact(fileContent);
final DbArtifact artifactBySha1 = artifactFilesystemRepository.getArtifactBySha1(TENANT,
final AbstractDbArtifact artifactBySha1 = artifactFilesystemRepository.getArtifactBySha1(TENANT,
artifact.getHashes().getSha1());
assertThat(artifactBySha1).isNotNull();
}

View File

@@ -16,6 +16,7 @@ import java.io.IOException;
import org.apache.commons.io.IOUtils;
import org.assertj.core.api.Assertions;
import org.eclipse.hawkbit.artifact.repository.model.DbArtifactHash;
import org.junit.Test;
import ru.yandex.qatools.allure.annotations.Description;
@@ -30,7 +31,8 @@ public class ArtifactFilesystemTest {
@Description("Verifies that an exception is thrown on opening an InputStream when file does not exists")
public void getInputStreamOfNonExistingFileThrowsException() {
final File file = new File("fileWhichTotalDoesNotExists");
final ArtifactFilesystem underTest = new ArtifactFilesystem(file);
final ArtifactFilesystem underTest = new ArtifactFilesystem(file, "fileWhichTotalDoesNotExists",
new DbArtifactHash("1", "2"), 0L, null);
try {
underTest.getFileInputStream();
Assertions.fail("Expected a FileNotFoundException because file does not exists");
@@ -45,7 +47,8 @@ public class ArtifactFilesystemTest {
final File createTempFile = File.createTempFile(ArtifactFilesystemTest.class.getSimpleName(), "");
createTempFile.deleteOnExit();
final ArtifactFilesystem underTest = new ArtifactFilesystem(createTempFile);
final ArtifactFilesystem underTest = new ArtifactFilesystem(createTempFile,
ArtifactFilesystemTest.class.getSimpleName(), new DbArtifactHash("1", "2"), 0L, null);
final byte[] buffer = new byte[1024];
IOUtils.read(underTest.getFileInputStream(), buffer);
}