Skip to content
117 changes: 11 additions & 106 deletions jbake-core/src/main/java/org/jbake/app/ContentStore.java
Original file line number Diff line number Diff line change
Expand Up @@ -29,45 +29,34 @@
import com.orientechnologies.orient.core.db.ODatabaseType;
import com.orientechnologies.orient.core.db.OrientDB;
import com.orientechnologies.orient.core.db.OrientDBConfig;
import com.orientechnologies.orient.core.metadata.schema.OClass;
import com.orientechnologies.orient.core.metadata.schema.OSchema;
import com.orientechnologies.orient.core.metadata.schema.OType;
import com.orientechnologies.orient.core.record.OElement;
import com.orientechnologies.orient.core.sql.executor.OResultSet;
import org.jbake.model.DocumentModel;
import org.jbake.model.DocumentTypes;
import org.jbake.model.ModelAttributes;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;


import java.io.File;
import java.util.Collections;
import java.util.HashSet;
import java.util.Set;

/**
* @author jdlee
*/
* @author jdlee */
public class ContentStore {

private SchemaManager schemaManager;
private static final String STATEMENT_GET_PUBLISHED_POST_BY_TYPE_AND_TAG = "select * from Documents where status='published' and type='%s' and ? in tags order by date desc";
private static final String STATEMENT_GET_DOCUMENT_STATUS_BY_DOCTYPE_AND_URI = "select sha1,rendered from Documents where sourceuri=?";
private static final String STATEMENT_GET_PUBLISHED_COUNT = "select count(*) as count from Documents where status='published' and type='%s'";
private static final String STATEMENT_MARK_CONTENT_AS_RENDERD = "update Documents set rendered=true where rendered=false and type='%s' and sourceuri='%s' and cached=true";
private static final String STATEMENT_DELETE_DOCTYPE_BY_SOURCEURI = "delete from Documents where sourceuri=?";
private static final String STATEMENT_GET_UNDRENDERED_CONTENT = "select * from Documents where rendered=false order by date desc";
private static final String STATEMENT_GET_SIGNATURE_FOR_TEMPLATES = "select sha1 from Signatures where key='templates'";
private static final String STATEMENT_GET_TAGS_FROM_PUBLISHED_POSTS = "select tags from Documents where status='published' and type='post'";
private static final String STATEMENT_GET_ALL_CONTENT_BY_DOCTYPE = "select * from Documents where type='%s' order by date desc";
private static final String STATEMENT_GET_PUBLISHED_CONTENT_BY_DOCTYPE = "select * from Documents where status='published' and type='%s' order by date desc";
private static final String STATEMENT_GET_PUBLISHED_POSTS_BY_TAG = "select * from Documents where status='published' and type='post' and ? in tags order by date desc";
private static final String STATEMENT_GET_TAGS_BY_DOCTYPE = "select tags from Documents where status='published' and type='%s'";
private static final String STATEMENT_INSERT_TEMPLATES_SIGNATURE = "insert into Signatures(key,sha1) values('templates',?)";
private static final String STATEMENT_DELETE_ALL = "delete from Documents where type='%s'";
private static final String STATEMENT_UPDATE_TEMPLATE_SIGNATURE = "update Signatures set sha1=? where key='templates'";
private static final String STATEMENT_GET_DOCUMENT_COUNT_BY_TYPE = "select count(*) as count from Documents where type='%s'";

private final Logger logger = LoggerFactory.getLogger(ContentStore.class);
private final String type;
private final String name;

Expand Down Expand Up @@ -95,10 +84,9 @@ public void startup() {
orient.createIfNotExists(name, ODatabaseType.valueOf(type.toUpperCase()));

db = orient.open(name, "admin", "admin");

schemaManager = new SchemaManager(db);
activateOnCurrentThread();

updateSchema();
schemaManager.updateSchema();
}

public long getStart() {
Expand All @@ -122,18 +110,6 @@ public void resetPagination() {
this.limit = -1;
}

public final void updateSchema() {

OSchema schema = db.getMetadata().getSchema();

if (!schema.existsClass(Schema.DOCUMENTS)) {
createDocType(schema);
}
if (!schema.existsClass(Schema.SIGNATURES)) {
createSignatureType(schema);
}
}

public void close() {
if (db != null) {
activateOnCurrentThread();
Expand Down Expand Up @@ -258,10 +234,6 @@ private DocumentList<DocumentModel> getAllTagsFromPublishedPosts() {
return query(STATEMENT_GET_TAGS_FROM_PUBLISHED_POSTS);
}

private DocumentList<DocumentModel> getSignaturesForTemplates() {
return query(STATEMENT_GET_SIGNATURE_FOR_TEMPLATES);
}

public DocumentList<DocumentModel> getUnrenderedContent() {
return query(STATEMENT_GET_UNDRENDERED_CONTENT);
}
Expand All @@ -275,19 +247,6 @@ public void markContentAsRendered(DocumentModel document) {
executeCommand(statement);
}

private void updateSignatures(String currentTemplatesSignature) {
executeCommand(STATEMENT_UPDATE_TEMPLATE_SIGNATURE, currentTemplatesSignature);
}

public void deleteAllByDocType(String docType) {
String statement = String.format(STATEMENT_DELETE_ALL, docType);
executeCommand(statement);
}

private void insertTemplatesSignature(String currentTemplatesSignature) {
executeCommand(STATEMENT_INSERT_TEMPLATES_SIGNATURE, currentTemplatesSignature);
}

private DocumentList<DocumentModel> query(String sql) {
activateOnCurrentThread();
OResultSet results = db.query(sql);
Expand Down Expand Up @@ -315,6 +274,10 @@ public Set<String> getTags() {
return result;
}

public SchemaManager getSchemaManager() {
return schemaManager;
}

public Set<String> getAllTags() {
Set<String> result = new HashSet<>();
for (String docType : DocumentTypes.getDocumentTypes()) {
Expand All @@ -328,78 +291,20 @@ public Set<String> getAllTags() {
return result;
}

private void createDocType(final OSchema schema) {
logger.debug("Create document class");

OClass page = schema.createClass(Schema.DOCUMENTS);
page.createProperty(ModelAttributes.SHA1, OType.STRING).setNotNull(true);
page.createIndex(Schema.DOCUMENTS + "sha1Index", OClass.INDEX_TYPE.NOTUNIQUE, ModelAttributes.SHA1);
page.createProperty(ModelAttributes.SOURCE_URI, OType.STRING).setNotNull(true);
page.createIndex(Schema.DOCUMENTS + "sourceUriIndex", OClass.INDEX_TYPE.UNIQUE, ModelAttributes.SOURCE_URI);
page.createProperty(ModelAttributes.CACHED, OType.BOOLEAN).setNotNull(true);
page.createIndex(Schema.DOCUMENTS + "cachedIndex", OClass.INDEX_TYPE.NOTUNIQUE, ModelAttributes.CACHED);
page.createProperty(ModelAttributes.RENDERED, OType.BOOLEAN).setNotNull(true);
page.createIndex(Schema.DOCUMENTS + "renderedIndex", OClass.INDEX_TYPE.NOTUNIQUE, ModelAttributes.RENDERED);
page.createProperty(ModelAttributes.STATUS, OType.STRING).setNotNull(true);
page.createIndex(Schema.DOCUMENTS + "statusIndex", OClass.INDEX_TYPE.NOTUNIQUE, ModelAttributes.STATUS);
page.createProperty(ModelAttributes.TYPE, OType.STRING).setNotNull(true);
page.createIndex(Schema.DOCUMENTS + "typeIndex", OClass.INDEX_TYPE.NOTUNIQUE, ModelAttributes.TYPE);

}

private void createSignatureType(OSchema schema) {
OClass signatures = schema.createClass(Schema.SIGNATURES);
signatures.createProperty(ModelAttributes.SHA1, OType.STRING).setNotNull(true);
signatures.createIndex("sha1Idx", OClass.INDEX_TYPE.UNIQUE, ModelAttributes.SHA1);
}

public void updateAndClearCacheIfNeeded(boolean needed, File templateFolder) {

boolean clearCache = needed;

if (!needed) {
clearCache = updateTemplateSignatureIfChanged(templateFolder);
clearCache = this.schemaManager.updateTemplateSignatureIfChanged(templateFolder);
}

if (clearCache) {
deleteAllDocumentTypes();
this.updateSchema();
schemaManager.deleteAllDocumentTypes(); schemaManager.updateSchema();
}
}

private boolean updateTemplateSignatureIfChanged(File templateFolder) {
boolean templateSignatureChanged = false;

DocumentList<DocumentModel> docs = this.getSignaturesForTemplates();
String currentTemplatesSignature;
try {
currentTemplatesSignature = FileUtil.sha1(templateFolder);
} catch (Exception e) {
currentTemplatesSignature = "";
}
if (!docs.isEmpty()) {
String sha1 = docs.get(0).getSha1();
if (!sha1.equals(currentTemplatesSignature)) {
this.updateSignatures(currentTemplatesSignature);
templateSignatureChanged = true;
}
} else {
// first computation of templates signature
this.insertTemplatesSignature(currentTemplatesSignature);
templateSignatureChanged = true;
}
return templateSignatureChanged;
}

private void deleteAllDocumentTypes() {
for (String docType : DocumentTypes.getDocumentTypes()) {
try {
this.deleteAllByDocType(docType);
} catch (Exception e) {
// maybe a non existing document type
}
}
}

public boolean isActive() {
return db.isActiveOnCurrentThread();
Expand Down
67 changes: 29 additions & 38 deletions jbake-core/src/main/java/org/jbake/app/Crawler.java
Original file line number Diff line number Diff line change
Expand Up @@ -125,47 +125,38 @@ private void crawlFile(File sourceFile) {
}
}

/**
* Crawl all files and folders looking for data files.
*
* @param path Folder to start from
*/
private void crawlDataFiles(File path) {
File[] contents = path.listFiles(FileUtil.getDataFileFilter());
if (contents != null) {
Arrays.sort(contents);
for (File sourceFile : contents) {
if (sourceFile.isFile()) {
StringBuilder sb = new StringBuilder();
sb.append("Processing [").append(sourceFile.getPath()).append("]... ");
String sha1 = buildHash(sourceFile);
String uri = buildDataFileURI(sourceFile);
boolean process = true;
DocumentStatus status = DocumentStatus.NEW;
String docType = config.getDataFileDocType();
status = findDocumentStatus(uri, sha1);
if (status == DocumentStatus.UPDATED) {
sb.append(" : modified ");
db.deleteContent(uri);
} else if (status == DocumentStatus.IDENTICAL) {
sb.append(" : same ");
process = false;
}
if (!process) {
break;
}
if (DocumentStatus.NEW == status) {
sb.append(" : new ");
}
if (process) { // new or updated
crawlDataFile(sourceFile, sha1, uri, docType);
}
logger.info("{}", sb);
}
if (sourceFile.isDirectory()) {
crawlDataFiles(sourceFile);
}
if (contents == null) {
return;
}
Arrays.sort(contents);
for (File sourceFile : contents) {
if (sourceFile.isDirectory()) {
crawlDataFiles(sourceFile);
continue;
}
if (!sourceFile.isFile()) {
continue;
}
StringBuilder sb = new StringBuilder();
sb.append("Processing [").append(sourceFile.getPath()).append("]... ");
String sha1 = buildHash(sourceFile);
String uri = buildDataFileURI(sourceFile);
String docType = config.getDataFileDocType();
DocumentStatus status = findDocumentStatus(uri, sha1);
if (status == DocumentStatus.UPDATED) {
sb.append(" : modified ");
db.deleteContent(uri);
} else if (status == DocumentStatus.IDENTICAL) {
sb.append(" : same ");
break;
}
if (status == DocumentStatus.NEW) {
sb.append(" : new ");
}
crawlDataFile(sourceFile, sha1, uri, docType);
logger.info("{}", sb);
}
}

Expand Down
2 changes: 1 addition & 1 deletion jbake-core/src/main/java/org/jbake/app/DBUtil.java
Original file line number Diff line number Diff line change
Expand Up @@ -21,7 +21,7 @@ public static ContentStore createDataStore(final String type, String name) {

@Deprecated
public static void updateSchema(final ContentStore db) {
db.updateSchema();
db.getSchemaManager().updateSchema();
}

public static ContentStore createDataStore(JBakeConfiguration configuration) {
Expand Down
2 changes: 1 addition & 1 deletion jbake-core/src/main/java/org/jbake/app/Oven.java
Original file line number Diff line number Diff line change
Expand Up @@ -159,7 +159,7 @@ public void bake() {
LOGGER.info("Baking has started...");
contentStore.startup();
updateDocTypesFromConfiguration();
contentStore.updateSchema();
contentStore.getSchemaManager().updateSchema();
contentStore.updateAndClearCacheIfNeeded(config.getClearCache(), config.getTemplateFolder());

// process source content
Expand Down
12 changes: 4 additions & 8 deletions jbake-core/src/main/java/org/jbake/app/Renderer.java
Original file line number Diff line number Diff line change
Expand Up @@ -185,7 +185,6 @@ public void renderIndexPaging(String indexFile) throws Exception {
int postsPerPage = config.getPostsPerPage();

if (totalPosts == 0) {
//paging makes no sense. render single index file instead
renderIndex(indexFile);
} else {
PagingHelper pagingHelper = new PagingHelper(totalPosts, postsPerPage);
Expand All @@ -196,26 +195,23 @@ public void renderIndexPaging(String indexFile) throws Exception {

try {
db.setLimit(postsPerPage);
for (int pageStart = 0, page = 1; pageStart < totalPosts; pageStart += postsPerPage, page++) {
for (int page = 1; page <= pagingHelper.getNumberOfPages(); page++) {
int pageStart = (page - 1) * postsPerPage;
String fileName = indexFile;

db.setStart(pageStart);
model.setCurrentPageNuber(page);
String previous = pagingHelper.getPreviousFileName(page);
model.setPreviousFilename(previous);
String nextFileName = pagingHelper.getNextFileName(page);
model.setNextFileName(nextFileName);

DocumentModel contentModel = buildSimpleModel(MASTERINDEX_TEMPLATE_NAME);

if (page > 1) {
contentModel.setRootPath("../");
}
model.setContent(contentModel);

// Add page number to file name
fileName = pagingHelper.getCurrentFileName(page, fileName);
ModelRenderingConfig renderConfig = new ModelRenderingConfig(fileName, model, MASTERINDEX_TEMPLATE_NAME);
ModelRenderingConfig renderConfig =
new ModelRenderingConfig(fileName, model, MASTERINDEX_TEMPLATE_NAME);
render(renderConfig);
}
db.resetPagination();
Expand Down
Loading