package org.jbake;
import com.orientechnologies.orient.core.record.impl.ODocument;
import org.jbake.app.Crawler;
import org.jbake.model.DocumentAttributes;
import javax.xml.bind.DatatypeConverter;
import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;
import java.util.Date;
import java.util.HashMap;
import java.util.Map;
import java.util.Random;
public class FakeDocumentBuilder {
Map<String, Object> fileModel = new HashMap<String, Object>();
String type;
private boolean hasSourceUri = false;
private boolean hasSha1 = false;
private boolean hasDate = false;
public FakeDocumentBuilder(String type) {
this.type = type;
}
public FakeDocumentBuilder withName(String name) {
fileModel.put(DocumentAttributes.NAME.toString(), name);
return this;
}
public FakeDocumentBuilder withStatus(String status) {
fileModel.put(DocumentAttributes.STATUS.toString(), status);
return this;
}
public FakeDocumentBuilder withRandomSha1() throws NoSuchAlgorithmException {
fileModel.put(DocumentAttributes.SHA1.toString(), getRandomSha1());
hasSha1 = true;
return this;
}
public FakeDocumentBuilder withDate(Date date) {
fileModel.put(Crawler.Attributes.DATE, date);
hasDate = true;
return this;
}
private FakeDocumentBuilder withCurrentDate() {
fileModel.put(Crawler.Attributes.DATE, new Date() );
return this;
}
private FakeDocumentBuilder withRandomSourceUri() throws NoSuchAlgorithmException {
String path = "/tmp/" + getRandomSha1() + ".txt";
fileModel.put(DocumentAttributes.SOURCE_URI.toString(), path);
return this;
}
public FakeDocumentBuilder withCached(boolean cached) {
fileModel.put(DocumentAttributes.CACHED.toString(), cached);
return this;
}
public void build() {
try {
if ( ! hasSourceUri() ) {
this.withRandomSourceUri();
}
if ( ! hasSha1() ) {
this.withRandomSha1();
}
if ( ! hasDate() ) {
this.withCurrentDate();
}
ODocument document = new ODocument(type).fromMap(fileModel);
document.save();
} catch (NoSuchAlgorithmException e) {
e.printStackTrace();
}
}
private String getRandomSha1() throws NoSuchAlgorithmException {
MessageDigest sha1Digest = MessageDigest.getInstance("SHA-1");
Random random = new Random();
int size = random.nextInt(1000) + 1000;
byte[] content = new byte[size];
random.nextBytes(content);
return DatatypeConverter.printHexBinary(sha1Digest.digest(content));
}
private boolean hasDate() {
return hasDate;
}
private boolean hasSha1() {
return hasSha1;
}
private boolean hasSourceUri() {
return hasSourceUri;
}
}