/*
* Copyright 2016 The Simple File Server Authors
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.sfs.vo;
import com.google.common.base.Optional;
import com.google.common.primitives.Longs;
import io.vertx.core.MultiMap;
import org.sfs.SfsRequest;
import org.sfs.util.MessageDigestFactory;
import java.util.List;
import java.util.regex.Matcher;
import static com.google.common.base.Optional.fromNullable;
import static com.google.common.io.BaseEncoding.base64;
import static com.google.common.net.HttpHeaders.CONTENT_LENGTH;
import static com.google.common.primitives.Ints.tryParse;
import static java.util.Collections.emptyList;
import static org.sfs.util.MessageDigestFactory.fromValueIfExists;
import static org.sfs.util.SfsHttpQueryParams.COMPUTED_DIGEST;
import static org.sfs.util.SfsHttpQueryParams.POSITION;
import static org.sfs.util.SfsHttpQueryParams.VERSION;
import static org.sfs.util.SfsHttpQueryParams.VOLUME;
public class XBlob {
private Integer volume;
private Long position;
private Long length;
private byte[] sha512;
private byte[] version;
private Long ttl;
private List<MessageDigestFactory> messageDigests;
public Optional<Integer> getVolume() {
return fromNullable(volume);
}
public XBlob setVolume(Integer volume) {
this.volume = volume;
return this;
}
public Optional<Long> getPosition() {
return fromNullable(position);
}
public XBlob setPosition(Long position) {
this.position = position;
return this;
}
public Optional<byte[]> getSha512() {
return fromNullable(sha512);
}
public XBlob setSha512(byte[] sha512) {
this.sha512 = sha512;
return this;
}
public Optional<Long> getLength() {
return fromNullable(length);
}
public XBlob setLength(Long length) {
this.length = length;
return this;
}
public Optional<byte[]> getVersion() {
return fromNullable(version);
}
public XBlob setVersion(byte[] version) {
this.version = version;
return this;
}
public Optional<Long> getTtl() {
return fromNullable(ttl);
}
public XBlob setTtl(Long ttl) {
this.ttl = ttl;
return this;
}
public List<MessageDigestFactory> getMessageDigests() {
if (messageDigests == null) {
return emptyList();
}
return messageDigests;
}
public XBlob merge(SfsRequest httpServerRequest) {
MultiMap queryParams = httpServerRequest.params();
MultiMap headers = httpServerRequest.headers();
if (queryParams.contains(VOLUME)) {
volume = tryParse(queryParams.get(VOLUME));
}
if (queryParams.contains(POSITION)) {
position = Longs.tryParse(queryParams.get(POSITION));
}
if (queryParams.contains(VERSION)) {
version = base64().decode(queryParams.get(VERSION));
}
if (headers.contains(CONTENT_LENGTH)) {
length = Longs.tryParse(headers.get(CONTENT_LENGTH));
}
for (String queryParam : queryParams.names()) {
Matcher matcher = COMPUTED_DIGEST.matcher(queryParam);
if (matcher.matches()) {
MessageDigestFactory digest = fromValueIfExists(matcher.group(1)).get();
messageDigests.add(digest);
}
}
return this;
}
}