From b0051808b6070bb6d5941a189d7c0a3ad60ef3f8 Mon Sep 17 00:00:00 2001 From: Richard Schoeller Date: Sat, 17 Jun 2017 23:34:11 -0400 Subject: [PATCH 1/3] Fix codebeat issues * Fixes #368 - code duplication in the endpoints (create base classes to share behavior) * Fixes #369 - codebeat issues in PersonRender (create some mixin interfaces to spread the load) * Fixes #376 - code duplication between AttributeDocumentMongo and MultimediaDocumentMongo (reorder methods to make different) --- .../mongo/domain/AttributeDocumentMongo.java | 8 +- .../renderer/PersonLifeSpanRenderer.java | 45 +++++++++ .../renderer/PersonNameRenderer.java | 89 +++++++++++++++++ .../gedbrowser/renderer/PersonRenderer.java | 98 +------------------ .../test/AnonymousPersonRendererTest.java | 4 +- .../renderer/test/PersonRendererTest.java | 2 +- .../geoservice/endpoint/BackupEndpoint.java | 59 ++--------- .../endpoint/BaseBackupEndpoint.java | 83 ++++++++++++++++ .../endpoint/BaseGeoCodeEndpoint.java | 64 ++++++++++++ .../geoservice/endpoint/ClearEndpoint.java | 39 +------- .../endpoint/LoadAndFindEndpoint.java | 39 +------- .../geoservice/endpoint/LoadEndpoint.java | 37 +------ .../geoservice/endpoint/RestoreEndpoint.java | 58 ++--------- .../test/BackupRestoreEndpointTest.java | 6 +- 14 files changed, 317 insertions(+), 314 deletions(-) create mode 100644 gedbrowser-renderer/src/main/java/org/schoellerfamily/gedbrowser/renderer/PersonLifeSpanRenderer.java create mode 100644 gedbrowser-renderer/src/main/java/org/schoellerfamily/gedbrowser/renderer/PersonNameRenderer.java create mode 100644 geoservice/src/main/java/org/schoellerfamily/geoservice/endpoint/BaseBackupEndpoint.java create mode 100644 geoservice/src/main/java/org/schoellerfamily/geoservice/endpoint/BaseGeoCodeEndpoint.java diff --git a/gedbrowser-mongo-dao/src/main/java/org/schoellerfamily/gedbrowser/persistence/mongo/domain/AttributeDocumentMongo.java b/gedbrowser-mongo-dao/src/main/java/org/schoellerfamily/gedbrowser/persistence/mongo/domain/AttributeDocumentMongo.java index b0138d04..170fdd02 100644 --- a/gedbrowser-mongo-dao/src/main/java/org/schoellerfamily/gedbrowser/persistence/mongo/domain/AttributeDocumentMongo.java +++ b/gedbrowser-mongo-dao/src/main/java/org/schoellerfamily/gedbrowser/persistence/mongo/domain/AttributeDocumentMongo.java @@ -45,16 +45,16 @@ public final void loadGedObject(final GedDocumentLoader loader, * {@inheritDoc} */ @Override - public final String getTail() { - return this.tail; + public final void setTail(final String tail) { + this.tail = tail; } /** * {@inheritDoc} */ @Override - public final void setTail(final String tail) { - this.tail = tail; + public final String getTail() { + return this.tail; } /** diff --git a/gedbrowser-renderer/src/main/java/org/schoellerfamily/gedbrowser/renderer/PersonLifeSpanRenderer.java b/gedbrowser-renderer/src/main/java/org/schoellerfamily/gedbrowser/renderer/PersonLifeSpanRenderer.java new file mode 100644 index 00000000..cae90c05 --- /dev/null +++ b/gedbrowser-renderer/src/main/java/org/schoellerfamily/gedbrowser/renderer/PersonLifeSpanRenderer.java @@ -0,0 +1,45 @@ +package org.schoellerfamily.gedbrowser.renderer; + +import org.schoellerfamily.gedbrowser.datamodel.Person; +import org.schoellerfamily.gedbrowser.datamodel.visitor.GetDateVisitor; + +/** + * @author Dick Schoeller + */ +public interface PersonLifeSpanRenderer { + /** + * @return whether the current person is confidential. + */ + boolean isConfidential(); + + /** + * @return whether the current person is confidential. + */ + boolean isHiddenLiving(); + + /** + * @return the GedObject + */ + Person getGedObject(); + + /** + * @return lifespan string. + */ + default String getLifeSpanString() { + if (isConfidential() || isHiddenLiving()) { + return ""; + } + + return String.format("(%s-%s)", date("Birth"), date("Death")); + } + + /** + * @param type the event type to find a date for + * @return the date string + */ + default String date(final String type) { + final GetDateVisitor birthVisitor = new GetDateVisitor(type); + getGedObject().accept(birthVisitor); + return birthVisitor.getDate(); + } +} diff --git a/gedbrowser-renderer/src/main/java/org/schoellerfamily/gedbrowser/renderer/PersonNameRenderer.java b/gedbrowser-renderer/src/main/java/org/schoellerfamily/gedbrowser/renderer/PersonNameRenderer.java new file mode 100644 index 00000000..7f59eca9 --- /dev/null +++ b/gedbrowser-renderer/src/main/java/org/schoellerfamily/gedbrowser/renderer/PersonNameRenderer.java @@ -0,0 +1,89 @@ +package org.schoellerfamily.gedbrowser.renderer; + +import org.schoellerfamily.gedbrowser.datamodel.GedObject; +import org.schoellerfamily.gedbrowser.datamodel.Name; +import org.schoellerfamily.gedbrowser.datamodel.Person; + +/** + * @author Dick Schoeller + */ +public interface PersonNameRenderer { + /** + * @return whether the current person is confidential. + */ + boolean isConfidential(); + + /** + * @return whether the current person is confidential. + */ + boolean isHiddenLiving(); + + /** + * @param attribute The sub-object to render. + * @return The renderer. + */ + GedRenderer createGedRenderer(GedObject attribute); + + /** + * @return the GedObject + */ + Person getGedObject(); + + /** + * @return the name string in title format. + */ + default String getTitleName() { + final Name name = getGedObject().getName(); + if (isConfidential()) { + return "Confidential"; + } else if (isHiddenLiving()) { + return "Living"; + } else { + final GedRenderer nameRenderer = createGedRenderer(name); + return nameRenderer.getNameHtml(); + } + } + + /** + * @return Get the whole name without markup. + */ + default String getWholeName() { + if (isConfidential()) { + return "Confidential"; + } else if (isHiddenLiving()) { + return "Living"; + } + final Name name = getGedObject().getName(); + + final String prefix = + RenderingContextRenderer.escapeString(name.getPrefix()); + final String surname = + RenderingContextRenderer.escapeString(name.getSurname()); + final String suffix = + RenderingContextRenderer.escapeString(" ", name.getSuffix()); + + return String.format("%s %s%s", prefix, surname, suffix); + } + + /** + * @return surname if not confidential + */ + default String getSurname() { + if (isConfidential() || isHiddenLiving()) { + return "?"; + } else { + return getGedObject().getSurname(); + } + } + + /** + * @return surname first letter if not confidential + */ + default String getSurnameLetter() { + if (isConfidential() || isHiddenLiving()) { + return "?"; + } else { + return getGedObject().getSurnameLetter(); + } + } +} diff --git a/gedbrowser-renderer/src/main/java/org/schoellerfamily/gedbrowser/renderer/PersonRenderer.java b/gedbrowser-renderer/src/main/java/org/schoellerfamily/gedbrowser/renderer/PersonRenderer.java index c49308c4..aba76f6d 100644 --- a/gedbrowser-renderer/src/main/java/org/schoellerfamily/gedbrowser/renderer/PersonRenderer.java +++ b/gedbrowser-renderer/src/main/java/org/schoellerfamily/gedbrowser/renderer/PersonRenderer.java @@ -7,10 +7,8 @@ import org.schoellerfamily.gedbrowser.analytics.LivingEstimator; import org.schoellerfamily.gedbrowser.datamodel.Family; import org.schoellerfamily.gedbrowser.datamodel.GedObject; -import org.schoellerfamily.gedbrowser.datamodel.Name; import org.schoellerfamily.gedbrowser.datamodel.Person; import org.schoellerfamily.gedbrowser.datamodel.navigator.PersonNavigator; -import org.schoellerfamily.gedbrowser.datamodel.visitor.GetDateVisitor; import org.schoellerfamily.gedbrowser.datamodel.visitor.PersonVisitor; /** @@ -20,12 +18,8 @@ */ public final class PersonRenderer extends GedRenderer implements IndexHrefRenderer, HeaderHrefRenderer, - SubmittorsHrefRenderer, SourcesHrefRenderer { - /** - * Number of generations, including the root when rendering the tree. - */ - private static final int TREE_GENERATIONS = 5; - + SubmittorsHrefRenderer, SourcesHrefRenderer, + PersonNameRenderer, PersonLifeSpanRenderer { /** * Connection to helper to estimate whether this person is living. */ @@ -64,42 +58,6 @@ public ParentsRenderer getParents() { return parentsRenderer; } - /** - * @return the name string in title format. - */ - public String getTitleName() { - final Name name = getGedObject().getName(); - if (isConfidential()) { - return "Confidential"; - } else if (isHiddenLiving()) { - return "Living"; - } else { - final GedRenderer nameRenderer = createGedRenderer(name); - return nameRenderer.getNameHtml(); - } - } - - /** - * @return lifespan string. - */ - public String getLifeSpanString() { - if (isConfidential() || isHiddenLiving()) { - return ""; - } - - return String.format("(%s-%s)", date("Birth"), date("Death")); - } - - /** - * @param type the event type to find a date for - * @return the date string - */ - private String date(final String type) { - final GetDateVisitor birthVisitor = new GetDateVisitor(type); - getGedObject().accept(birthVisitor); - return birthVisitor.getDate(); - } - /** * @return the ID string of the person. */ @@ -107,24 +65,6 @@ public String getIdString() { return getGedObject().getString(); } - /** - * @return Get the whole name without markup. - */ - public String getWholeName() { - if (isConfidential()) { - return "Confidential"; - } else if (isHiddenLiving()) { - return "Living"; - } - final Name name = getGedObject().getName(); - - final String prefix = escapeString(name.getPrefix()); - final String surname = escapeString(name.getSurname()); - final String suffix = escapeString(" ", name.getSuffix()); - - return String.format("%s %s%s", prefix, surname, suffix); - } - /** * @return the list of renderers for the families of the person. */ @@ -168,20 +108,10 @@ public List> getAttributes() { } /** - * @return the 2D array of cells. - */ - public CellRow[] getTreeRows() { - final TreeTableRenderer ttr = new TreeTableRenderer(this, - confidentialGenCount(TREE_GENERATIONS)); - return ttr.getTreeRows(); - } - - /** - * @param generations the number of generations to diplay. + * @param generations the number of generations to display. * @return the 2D array of cells. */ public CellRow[] getTreeRows(final int generations) { - // TODO this is the one that is actually used. final TreeTableRenderer ttr = new TreeTableRenderer(this, confidentialGenCount(generations)); return ttr.getTreeRows(); @@ -230,26 +160,4 @@ public String getIndexHref() { return "surnames?db=" + getGedObject().getDbName() + "&letter=" + surnameLetter + "#" + surname; } - - /** - * @return surname if not confidential - */ - public String getSurname() { - if (isConfidential() || isHiddenLiving()) { - return "?"; - } else { - return getGedObject().getSurname(); - } - } - - /** - * @return surname first letter if not confidential - */ - public String getSurnameLetter() { - if (isConfidential() || isHiddenLiving()) { - return "?"; - } else { - return getGedObject().getSurnameLetter(); - } - } } diff --git a/gedbrowser-renderer/src/test/java/org/schoellerfamily/gedbrowser/renderer/test/AnonymousPersonRendererTest.java b/gedbrowser-renderer/src/test/java/org/schoellerfamily/gedbrowser/renderer/test/AnonymousPersonRendererTest.java index d22a3d44..45ef0a0c 100644 --- a/gedbrowser-renderer/src/test/java/org/schoellerfamily/gedbrowser/renderer/test/AnonymousPersonRendererTest.java +++ b/gedbrowser-renderer/src/test/java/org/schoellerfamily/gedbrowser/renderer/test/AnonymousPersonRendererTest.java @@ -434,7 +434,7 @@ public void testRenderGeorgeTree() throws IOException { final Person george = (Person) root.find("I9"); final PersonRenderer personRenderer = new PersonRenderer(george, new GedRendererFactory(), anonymousContext); - final CellRow[] cellRows = personRenderer.getTreeRows(); + final CellRow[] cellRows = personRenderer.getTreeRows(5); int i = 0; for (final CellRow cellRow : cellRows) { final CellRenderer[] cellRenderers = cellRow.getCells(); @@ -456,7 +456,7 @@ public void testRenderArnoldTree() throws IOException { final Person arnold = (Person) root.find("I7"); final PersonRenderer personRenderer = new PersonRenderer(arnold, new GedRendererFactory(), anonymousContext); - final CellRow[] cellRows = personRenderer.getTreeRows(); + final CellRow[] cellRows = personRenderer.getTreeRows(5); int i = 0; for (final CellRow cellRow : cellRows) { final CellRenderer[] cellRenderers = cellRow.getCells(); diff --git a/gedbrowser-renderer/src/test/java/org/schoellerfamily/gedbrowser/renderer/test/PersonRendererTest.java b/gedbrowser-renderer/src/test/java/org/schoellerfamily/gedbrowser/renderer/test/PersonRendererTest.java index 9c79dc89..ff38d882 100644 --- a/gedbrowser-renderer/src/test/java/org/schoellerfamily/gedbrowser/renderer/test/PersonRendererTest.java +++ b/gedbrowser-renderer/src/test/java/org/schoellerfamily/gedbrowser/renderer/test/PersonRendererTest.java @@ -633,7 +633,7 @@ public void testRenderGeorgeTree() throws IOException { final Person george = (Person) root.find("I9"); final PersonRenderer personRenderer = new PersonRenderer(george, new GedRendererFactory(), userContext); - final CellRow[] cellRows = personRenderer.getTreeRows(); + final CellRow[] cellRows = personRenderer.getTreeRows(5); int i = 0; for (final CellRow cellRow : cellRows) { final CellRenderer[] cellRenderers = cellRow.getCells(); diff --git a/geoservice/src/main/java/org/schoellerfamily/geoservice/endpoint/BackupEndpoint.java b/geoservice/src/main/java/org/schoellerfamily/geoservice/endpoint/BackupEndpoint.java index 4b5d0669..b876e24c 100644 --- a/geoservice/src/main/java/org/schoellerfamily/geoservice/endpoint/BackupEndpoint.java +++ b/geoservice/src/main/java/org/schoellerfamily/geoservice/endpoint/BackupEndpoint.java @@ -2,39 +2,23 @@ import java.io.File; import java.io.IOException; -import java.util.ArrayList; -import java.util.List; -import org.apache.commons.logging.Log; -import org.apache.commons.logging.LogFactory; import org.schoellerfamily.geoservice.backup.GeoCodeBackup; -import org.schoellerfamily.geoservice.persistence.GeoCode; import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.beans.factory.annotation.Value; -import org.springframework.boot.actuate.endpoint.Endpoint; import org.springframework.stereotype.Component; +import com.fasterxml.jackson.core.JsonParseException; +import com.fasterxml.jackson.databind.JsonMappingException; + /** * @author Dick Schoeller */ @Component -public class BackupEndpoint implements Endpoint> { - /** Logger. */ - private final transient Log logger = LogFactory.getLog(getClass()); - - /** */ - @Autowired - private GeoCode gcc; - +public class BackupEndpoint extends BaseBackupEndpoint { /** */ @Autowired private transient GeoCodeBackup backupManager; - /** */ - @Value("${geoservice.backupfile:" - + "/var/lib/gedbrowser/geoservice-backup.json}") - private transient String backupFile; - /** * {@inheritDoc} */ @@ -47,37 +31,8 @@ public final String getId() { * {@inheritDoc} */ @Override - public final List invoke() { - logger.info("Invoke backup to " + backupFile); - final List messages = new ArrayList<>(); - try { - backupManager.backup(new File(backupFile)); - messages.add("Backup succeed to " + backupFile); - } catch (IOException e) { - messages.add("Backup failed from " + backupFile); - messages.add("Exception: " + e.getMessage()); - logger.error("Backup failed", e); - } - messages.add(gcc.size() + " locations in the cache"); - messages.add( - gcc.size() - gcc.countNotFound() - + " geocoded locations in cache"); - return messages; - } - - /** - * {@inheritDoc} - */ - @Override - public final boolean isEnabled() { - return true; - } - - /** - * {@inheritDoc} - */ - @Override - public final boolean isSensitive() { - return true; + public void action(final File backupFile) + throws JsonParseException, JsonMappingException, IOException { + backupManager.backup(backupFile); } } diff --git a/geoservice/src/main/java/org/schoellerfamily/geoservice/endpoint/BaseBackupEndpoint.java b/geoservice/src/main/java/org/schoellerfamily/geoservice/endpoint/BaseBackupEndpoint.java new file mode 100644 index 00000000..46a5a8c4 --- /dev/null +++ b/geoservice/src/main/java/org/schoellerfamily/geoservice/endpoint/BaseBackupEndpoint.java @@ -0,0 +1,83 @@ +package org.schoellerfamily.geoservice.endpoint; + +import java.io.File; +import java.io.IOException; +import java.util.ArrayList; +import java.util.List; + +import org.apache.commons.logging.Log; +import org.apache.commons.logging.LogFactory; +import org.schoellerfamily.geoservice.persistence.GeoCode; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.boot.actuate.endpoint.Endpoint; + +import com.fasterxml.jackson.core.JsonParseException; +import com.fasterxml.jackson.databind.JsonMappingException; + +/** + * @author Dick Schoeller + */ +public abstract class BaseBackupEndpoint implements Endpoint> { + /** Logger. */ + private final transient Log logger = LogFactory.getLog(getClass()); + + /** */ + @Autowired + private GeoCode gcc; + + /** */ + @Value("${geoservice.backupfile:/var/lib/gedbrowser/geoservice}") + private transient String backupFileName; + + /** + * Do the backup related action. + * + * @param backupFile which backup file mean + * @throws JsonParseException if the JSON doesn't parse + * @throws JsonMappingException if JSON won't map to the data types + * @throws IOException if the file can't be accessed + */ + abstract void action(File backupFile) + throws JsonParseException, JsonMappingException, IOException; + + /** + * {@inheritDoc} + */ + @Override + public final boolean isEnabled() { + return true; + } + + /** + * {@inheritDoc} + */ + @Override + public final boolean isSensitive() { + return true; + } + + /** + * {@inheritDoc} + */ + @Override + public final List invoke() { + logger.info("Invoke " + getId() + " from " + backupFileName); + final List messages = new ArrayList<>(); + try { + action(new File(backupFileName)); + messages.add("Invoccation of " + getId() + " succeeded to/from " + + backupFileName); + } catch (IOException e) { + messages.add("Invoccation of " + getId() + " failed to/from " + + backupFileName); + messages.add("Exception: " + e.getMessage()); + logger.error("Invoccation of " + getId() + " failed", e); + } + messages.add(gcc.size() + " locations in the cache"); + messages.add( + gcc.size() - gcc.countNotFound() + + " geocoded locations in cache"); + return messages; + } +} diff --git a/geoservice/src/main/java/org/schoellerfamily/geoservice/endpoint/BaseGeoCodeEndpoint.java b/geoservice/src/main/java/org/schoellerfamily/geoservice/endpoint/BaseGeoCodeEndpoint.java new file mode 100644 index 00000000..3c5f3f19 --- /dev/null +++ b/geoservice/src/main/java/org/schoellerfamily/geoservice/endpoint/BaseGeoCodeEndpoint.java @@ -0,0 +1,64 @@ +package org.schoellerfamily.geoservice.endpoint; + +import java.util.ArrayList; +import java.util.List; + +import org.schoellerfamily.geoservice.persistence.GeoCode; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.actuate.endpoint.Endpoint; + +/** + * @author Dick Schoeller + */ +public abstract class BaseGeoCodeEndpoint implements Endpoint> { + + /** */ + @Autowired + private GeoCode gcc; + + /** + * Do the appropriate load action. + */ + abstract void geoCodeAction(); + + /** + * Return the GeoCode object for these actions. + * + * @return the GeoCode + */ + public final GeoCode getGeoCode() { + return gcc; + } + + /** + * {@inheritDoc} + */ + @Override + public final boolean isEnabled() { + return true; + } + + /** + * {@inheritDoc} + */ + @Override + public final boolean isSensitive() { + return true; + } + + /** + * {@inheritDoc} + */ + @Override + public final List invoke() { + final List messages = new ArrayList<>(); + geoCodeAction(); + messages.add("Load complete"); + final long totalLocations = gcc.size(); + messages.add(totalLocations + " locations in the cache"); + final long codedLocations = totalLocations + - gcc.countNotFound(); + messages.add(codedLocations + " geocoded locations in cache"); + return messages; + } +} diff --git a/geoservice/src/main/java/org/schoellerfamily/geoservice/endpoint/ClearEndpoint.java b/geoservice/src/main/java/org/schoellerfamily/geoservice/endpoint/ClearEndpoint.java index 76db9488..d71474da 100644 --- a/geoservice/src/main/java/org/schoellerfamily/geoservice/endpoint/ClearEndpoint.java +++ b/geoservice/src/main/java/org/schoellerfamily/geoservice/endpoint/ClearEndpoint.java @@ -1,27 +1,17 @@ package org.schoellerfamily.geoservice.endpoint; -import java.util.ArrayList; -import java.util.List; - import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; -import org.schoellerfamily.geoservice.persistence.GeoCode; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.boot.actuate.endpoint.Endpoint; import org.springframework.stereotype.Component; /** * @author Dick Schoeller */ @Component -public class ClearEndpoint implements Endpoint> { +public class ClearEndpoint extends BaseGeoCodeEndpoint { /** Logger. */ private final transient Log logger = LogFactory.getLog(getClass()); - /** */ - @Autowired - private GeoCode gcc; - /** * {@inheritDoc} */ @@ -34,31 +24,8 @@ public final String getId() { * {@inheritDoc} */ @Override - public final List invoke() { + public void geoCodeAction() { logger.info("Invoke clear"); - final List messages = new ArrayList<>(); - gcc.clear(); - messages.add("Cleared cache"); - messages.add(gcc.size() + " locations in the cache"); - messages.add( - gcc.size() - gcc.countNotFound() - + " geocoded locations in cache"); - return messages; - } - - /** - * {@inheritDoc} - */ - @Override - public final boolean isEnabled() { - return true; - } - - /** - * {@inheritDoc} - */ - @Override - public final boolean isSensitive() { - return true; + getGeoCode().clear(); } } diff --git a/geoservice/src/main/java/org/schoellerfamily/geoservice/endpoint/LoadAndFindEndpoint.java b/geoservice/src/main/java/org/schoellerfamily/geoservice/endpoint/LoadAndFindEndpoint.java index e36015cf..f8f93274 100644 --- a/geoservice/src/main/java/org/schoellerfamily/geoservice/endpoint/LoadAndFindEndpoint.java +++ b/geoservice/src/main/java/org/schoellerfamily/geoservice/endpoint/LoadAndFindEndpoint.java @@ -1,30 +1,20 @@ package org.schoellerfamily.geoservice.endpoint; -import java.util.ArrayList; -import java.util.List; - import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; -import org.schoellerfamily.geoservice.persistence.GeoCode; import org.schoellerfamily.geoservice.persistence.GeoCodeLoader; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Value; -import org.springframework.boot.actuate.endpoint.Endpoint; import org.springframework.stereotype.Component; /** * @author Dick Schoeller */ @Component -public class LoadAndFindEndpoint implements Endpoint> { - +public class LoadAndFindEndpoint extends BaseGeoCodeEndpoint { /** Logger. */ private final transient Log logger = LogFactory.getLog(getClass()); - /** */ - @Autowired - private GeoCode gcc; - /** */ @Autowired private GeoCodeLoader loader; @@ -46,31 +36,8 @@ public final String getId() { * {@inheritDoc} */ @Override - public final List invoke() { - logger.info("Invoke load from: " + loadFile); - final List messages = new ArrayList<>(); + public void geoCodeAction() { + logger.info("Invoke load and find from: " + loadFile); loader.loadAndFind(loadFile); - messages.add("Load complete"); - messages.add(gcc.size() + " locations in the cache"); - messages.add( - gcc.size() - gcc.countNotFound() - + " geocoded locations in cache"); - return messages; - } - - /** - * {@inheritDoc} - */ - @Override - public final boolean isEnabled() { - return true; - } - - /** - * {@inheritDoc} - */ - @Override - public final boolean isSensitive() { - return true; } } diff --git a/geoservice/src/main/java/org/schoellerfamily/geoservice/endpoint/LoadEndpoint.java b/geoservice/src/main/java/org/schoellerfamily/geoservice/endpoint/LoadEndpoint.java index 8fbce480..ce5b101f 100644 --- a/geoservice/src/main/java/org/schoellerfamily/geoservice/endpoint/LoadEndpoint.java +++ b/geoservice/src/main/java/org/schoellerfamily/geoservice/endpoint/LoadEndpoint.java @@ -1,30 +1,20 @@ package org.schoellerfamily.geoservice.endpoint; -import java.util.ArrayList; -import java.util.List; - import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; -import org.schoellerfamily.geoservice.persistence.GeoCode; import org.schoellerfamily.geoservice.persistence.GeoCodeLoader; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Value; -import org.springframework.boot.actuate.endpoint.Endpoint; import org.springframework.stereotype.Component; /** * @author Dick Schoeller */ @Component -public class LoadEndpoint implements Endpoint> { - +public class LoadEndpoint extends BaseGeoCodeEndpoint { /** Logger. */ private final transient Log logger = LogFactory.getLog(getClass()); - /** */ - @Autowired - private GeoCode gcc; - /** */ @Autowired private GeoCodeLoader loader; @@ -46,31 +36,8 @@ public final String getId() { * {@inheritDoc} */ @Override - public final List invoke() { + public void geoCodeAction() { logger.info("Invoke load from: " + loadFile); - final List messages = new ArrayList<>(); loader.load(loadFile); - messages.add("Load complete"); - messages.add(gcc.size() + " locations in the cache"); - messages.add( - gcc.size() - gcc.countNotFound() - + " geocoded locations in cache"); - return messages; - } - - /** - * {@inheritDoc} - */ - @Override - public final boolean isEnabled() { - return true; - } - - /** - * {@inheritDoc} - */ - @Override - public final boolean isSensitive() { - return true; } } diff --git a/geoservice/src/main/java/org/schoellerfamily/geoservice/endpoint/RestoreEndpoint.java b/geoservice/src/main/java/org/schoellerfamily/geoservice/endpoint/RestoreEndpoint.java index d3426e18..c383fd08 100644 --- a/geoservice/src/main/java/org/schoellerfamily/geoservice/endpoint/RestoreEndpoint.java +++ b/geoservice/src/main/java/org/schoellerfamily/geoservice/endpoint/RestoreEndpoint.java @@ -2,39 +2,24 @@ import java.io.File; import java.io.IOException; -import java.util.ArrayList; -import java.util.List; -import org.apache.commons.logging.Log; -import org.apache.commons.logging.LogFactory; import org.schoellerfamily.geoservice.backup.GeoCodeBackup; -import org.schoellerfamily.geoservice.persistence.GeoCode; import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.beans.factory.annotation.Value; -import org.springframework.boot.actuate.endpoint.Endpoint; import org.springframework.stereotype.Component; +import com.fasterxml.jackson.core.JsonParseException; +import com.fasterxml.jackson.databind.JsonMappingException; + /** * @author Dick Schoeller */ @Component -public class RestoreEndpoint implements Endpoint> { - - /** Logger. */ - private final transient Log logger = LogFactory.getLog(getClass()); - - /** */ - @Autowired - private GeoCode gcc; +public class RestoreEndpoint extends BaseBackupEndpoint { /** */ @Autowired private transient GeoCodeBackup backupManager; - /** */ - @Value("${geoservice.backupfile:/var/lib/gedbrowser/geoservice}") - private transient String backupFile; - /** * {@inheritDoc} */ @@ -47,37 +32,8 @@ public final String getId() { * {@inheritDoc} */ @Override - public final List invoke() { - logger.info("Invoke restore from " + backupFile); - final List messages = new ArrayList<>(); - try { - backupManager.recover(new File(backupFile)); - messages.add("Restore succeed from " + backupFile); - } catch (IOException e) { - messages.add("Restore failed from " + backupFile); - messages.add("Exception: " + e.getMessage()); - logger.error("Backup failed", e); - } - messages.add(gcc.size() + " locations in the cache"); - messages.add( - gcc.size() - gcc.countNotFound() - + " geocoded locations in cache"); - return messages; - } - - /** - * {@inheritDoc} - */ - @Override - public final boolean isEnabled() { - return true; - } - - /** - * {@inheritDoc} - */ - @Override - public final boolean isSensitive() { - return true; + public void action(final File backupFile) + throws JsonParseException, JsonMappingException, IOException { + backupManager.recover(backupFile); } } diff --git a/geoservice/src/test/java/org/schoellerfamily/geoservice/test/BackupRestoreEndpointTest.java b/geoservice/src/test/java/org/schoellerfamily/geoservice/test/BackupRestoreEndpointTest.java index 906333d1..c6bb56f7 100644 --- a/geoservice/src/test/java/org/schoellerfamily/geoservice/test/BackupRestoreEndpointTest.java +++ b/geoservice/src/test/java/org/schoellerfamily/geoservice/test/BackupRestoreEndpointTest.java @@ -59,6 +59,8 @@ public final void shouldReturn200WhenSendingRequestToBackupEndpoint() { String.class); then(entity.getStatusCode()).isEqualTo(HttpStatus.OK); + then(entity.getBody()).contains("backup succeeded to/from") + .contains("locations in the cache"); } /** */ @@ -74,7 +76,7 @@ public final void shouldReturn200WhenSendingRequestToRestoreEndpoint() { "http://localhost:" + this.mgt + "/restore", String.class); then(entity.getStatusCode()).isEqualTo(HttpStatus.OK); - then(entity.getBody()).contains("Restore succeed from") - .contains("locations in the cache"); + then(entity.getBody()).contains("restore succeeded to/from") + .contains("locations in the cache"); } } From cfbeb4ecd41b2de5c2ebf1ecdb071e962fd62937 Mon Sep 17 00:00:00 2001 From: Richard Schoeller Date: Sat, 17 Jun 2017 23:40:53 -0400 Subject: [PATCH 2/3] fix findbugs problem --- .../gedbrowser/renderer/SourcesRenderer.java | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/gedbrowser-renderer/src/main/java/org/schoellerfamily/gedbrowser/renderer/SourcesRenderer.java b/gedbrowser-renderer/src/main/java/org/schoellerfamily/gedbrowser/renderer/SourcesRenderer.java index cde5456a..740ed5ab 100644 --- a/gedbrowser-renderer/src/main/java/org/schoellerfamily/gedbrowser/renderer/SourcesRenderer.java +++ b/gedbrowser-renderer/src/main/java/org/schoellerfamily/gedbrowser/renderer/SourcesRenderer.java @@ -1,5 +1,6 @@ package org.schoellerfamily.gedbrowser.renderer; +import java.io.Serializable; import java.util.ArrayList; import java.util.Collection; import java.util.Comparator; @@ -25,7 +26,10 @@ public class SourcesRenderer extends GedRenderer * @author Dick Schoeller */ private static class SourceRendererComparator - implements Comparator { + implements Comparator, Serializable { + /** */ + private static final long serialVersionUID = 1L; + /** * {@inheritDoc} */ From bf95ce3bd39152288301e34dc48da25192ccf689 Mon Sep 17 00:00:00 2001 From: Richard Schoeller Date: Sun, 18 Jun 2017 00:00:53 -0400 Subject: [PATCH 3/3] fix default backup file --- .../geoservice/endpoint/BaseBackupEndpoint.java | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/geoservice/src/main/java/org/schoellerfamily/geoservice/endpoint/BaseBackupEndpoint.java b/geoservice/src/main/java/org/schoellerfamily/geoservice/endpoint/BaseBackupEndpoint.java index 46a5a8c4..c1afa25d 100644 --- a/geoservice/src/main/java/org/schoellerfamily/geoservice/endpoint/BaseBackupEndpoint.java +++ b/geoservice/src/main/java/org/schoellerfamily/geoservice/endpoint/BaseBackupEndpoint.java @@ -27,7 +27,8 @@ public abstract class BaseBackupEndpoint implements Endpoint> { private GeoCode gcc; /** */ - @Value("${geoservice.backupfile:/var/lib/gedbrowser/geoservice}") + @Value("${geoservice.backupfile:" + + "/var/lib/gedbrowser/geoservice-backup.json}") private transient String backupFileName; /**