From f9fe6a96fc57f91a09a47ea09ef31d972169758b Mon Sep 17 00:00:00 2001 From: Chris Henson Date: Thu, 25 May 2017 13:21:21 -0400 Subject: [PATCH 1/5] ignore + warnings when compiling with java 8 --- symmetric-client/.gitignore | 1 + 1 file changed, 1 insertion(+) diff --git a/symmetric-client/.gitignore b/symmetric-client/.gitignore index 03b5ded534..7246fe4223 100644 --- a/symmetric-client/.gitignore +++ b/symmetric-client/.gitignore @@ -4,3 +4,4 @@ /target /bin/ /.DS_Store +/build/ From 2b042b6bef82379c8581b6a675a81c6487c784c1 Mon Sep 17 00:00:00 2001 From: Chris Henson Date: Thu, 25 May 2017 13:21:45 -0400 Subject: [PATCH 2/5] ignore + warnings when compiling with java 8 --- symmetric-android/.gitignore | 1 + symmetric-core/.gitignore | 1 + .../java/org/jumpmind/symmetric/route/DataGapDetectorTest.java | 2 +- .../org/jumpmind/symmetric/service/impl/DataServiceTest.java | 2 +- symmetric-csv/.gitignore | 1 + symmetric-db/.gitignore | 1 + symmetric-io/.gitignore | 1 + symmetric-server/.gitignore | 1 + symmetric-util/.gitignore | 1 + symmetric-wrapper/.gitignore | 1 + 10 files changed, 10 insertions(+), 2 deletions(-) diff --git a/symmetric-android/.gitignore b/symmetric-android/.gitignore index b187e50140..4429052e8e 100644 --- a/symmetric-android/.gitignore +++ b/symmetric-android/.gitignore @@ -3,3 +3,4 @@ *.classpath /target /bin/ +/build/ diff --git a/symmetric-core/.gitignore b/symmetric-core/.gitignore index 0e000bff73..531a425b27 100644 --- a/symmetric-core/.gitignore +++ b/symmetric-core/.gitignore @@ -3,3 +3,4 @@ *.settings /target /bin/ +/build/ diff --git a/symmetric-core/src/test/java/org/jumpmind/symmetric/route/DataGapDetectorTest.java b/symmetric-core/src/test/java/org/jumpmind/symmetric/route/DataGapDetectorTest.java index 0a05307e38..8979525b18 100644 --- a/symmetric-core/src/test/java/org/jumpmind/symmetric/route/DataGapDetectorTest.java +++ b/symmetric-core/src/test/java/org/jumpmind/symmetric/route/DataGapDetectorTest.java @@ -271,7 +271,7 @@ public void testGapInGapFull() throws Exception { @SuppressWarnings("unchecked") ISqlRowMapper mapper = (ISqlRowMapper) Matchers.anyObject(); - when(sqlTemplate.query(Matchers.anyString(), mapper, Matchers.anyVararg())).thenAnswer(new Answer>() { + when(sqlTemplate.query(Matchers.anyString(), mapper, (Object[])Matchers.anyVararg())).thenAnswer(new Answer>() { public List answer(InvocationOnMock invocation) { List dataIds = new ArrayList(); long startId = (Long) invocation.getArguments()[2]; diff --git a/symmetric-core/src/test/java/org/jumpmind/symmetric/service/impl/DataServiceTest.java b/symmetric-core/src/test/java/org/jumpmind/symmetric/service/impl/DataServiceTest.java index 644e7c7aba..5f9d7f3daa 100644 --- a/symmetric-core/src/test/java/org/jumpmind/symmetric/service/impl/DataServiceTest.java +++ b/symmetric-core/src/test/java/org/jumpmind/symmetric/service/impl/DataServiceTest.java @@ -64,7 +64,7 @@ public void testFindDataGaps2() throws Exception { when(sqlTemplate.queryForLong(Matchers.anyString())).thenReturn(0L); @SuppressWarnings("unchecked") ISqlRowMapper anyMapper = (ISqlRowMapper) Matchers.anyObject(); - when(sqlTemplate.query(Matchers.anyString(), anyMapper, Matchers.anyVararg())).thenReturn(gaps1); + when(sqlTemplate.query(Matchers.anyString(), anyMapper, (Object[])Matchers.anyVararg())).thenReturn(gaps1); dataService.findDataGaps(); diff --git a/symmetric-csv/.gitignore b/symmetric-csv/.gitignore index 0e000bff73..531a425b27 100644 --- a/symmetric-csv/.gitignore +++ b/symmetric-csv/.gitignore @@ -3,3 +3,4 @@ *.settings /target /bin/ +/build/ diff --git a/symmetric-db/.gitignore b/symmetric-db/.gitignore index 0e000bff73..531a425b27 100644 --- a/symmetric-db/.gitignore +++ b/symmetric-db/.gitignore @@ -3,3 +3,4 @@ *.settings /target /bin/ +/build/ diff --git a/symmetric-io/.gitignore b/symmetric-io/.gitignore index 0e000bff73..531a425b27 100644 --- a/symmetric-io/.gitignore +++ b/symmetric-io/.gitignore @@ -3,3 +3,4 @@ *.settings /target /bin/ +/build/ diff --git a/symmetric-server/.gitignore b/symmetric-server/.gitignore index 03b5ded534..7246fe4223 100644 --- a/symmetric-server/.gitignore +++ b/symmetric-server/.gitignore @@ -4,3 +4,4 @@ /target /bin/ /.DS_Store +/build/ diff --git a/symmetric-util/.gitignore b/symmetric-util/.gitignore index 0e000bff73..531a425b27 100644 --- a/symmetric-util/.gitignore +++ b/symmetric-util/.gitignore @@ -3,3 +3,4 @@ *.settings /target /bin/ +/build/ diff --git a/symmetric-wrapper/.gitignore b/symmetric-wrapper/.gitignore index b1a90f9fb2..2e462a8e36 100644 --- a/symmetric-wrapper/.gitignore +++ b/symmetric-wrapper/.gitignore @@ -3,3 +3,4 @@ /target/ /.classpath /.project +/build/ From 27722efafee7fbf173b3592897d8998fe5271c20 Mon Sep 17 00:00:00 2001 From: Chris Henson Date: Thu, 25 May 2017 16:47:53 -0400 Subject: [PATCH 3/5] 0003127: Add logging to the DBFRouter to log failed line number and field --- .../file/FileTriggerFileModifiedListener.java | 4 +--- .../symmetric/file/FileTriggerTracker.java | 1 - .../org/jumpmind/symmetric/route/DBFRouter.java | 7 ++++--- .../jumpmind/symmetric/route/parse/DBFReader.java | 14 +++++++++++++- 4 files changed, 18 insertions(+), 8 deletions(-) diff --git a/symmetric-core/src/main/java/org/jumpmind/symmetric/file/FileTriggerFileModifiedListener.java b/symmetric-core/src/main/java/org/jumpmind/symmetric/file/FileTriggerFileModifiedListener.java index aa8487774b..772f8a5a27 100644 --- a/symmetric-core/src/main/java/org/jumpmind/symmetric/file/FileTriggerFileModifiedListener.java +++ b/symmetric-core/src/main/java/org/jumpmind/symmetric/file/FileTriggerFileModifiedListener.java @@ -28,13 +28,11 @@ import org.apache.commons.io.monitor.FileAlterationListenerAdaptor; import org.apache.commons.io.monitor.FileAlterationObserver; import org.jumpmind.symmetric.ISymmetricEngine; -import org.jumpmind.symmetric.common.ParameterConstants; import org.jumpmind.symmetric.model.FileSnapshot; -import org.jumpmind.symmetric.model.FileTrigger; import org.jumpmind.symmetric.model.FileSnapshot.LastEventType; -import org.jumpmind.symmetric.model.ProcessInfo.Status; import org.jumpmind.symmetric.model.FileTriggerRouter; import org.jumpmind.symmetric.model.ProcessInfo; +import org.jumpmind.symmetric.model.ProcessInfo.Status; import org.slf4j.Logger; import org.slf4j.LoggerFactory; diff --git a/symmetric-core/src/main/java/org/jumpmind/symmetric/file/FileTriggerTracker.java b/symmetric-core/src/main/java/org/jumpmind/symmetric/file/FileTriggerTracker.java index 4008aa0f90..2bda7110d3 100644 --- a/symmetric-core/src/main/java/org/jumpmind/symmetric/file/FileTriggerTracker.java +++ b/symmetric-core/src/main/java/org/jumpmind/symmetric/file/FileTriggerTracker.java @@ -27,7 +27,6 @@ import org.apache.commons.io.monitor.FileAlterationObserver; import org.jumpmind.exception.IoException; import org.jumpmind.symmetric.ISymmetricEngine; -import org.jumpmind.symmetric.common.ParameterConstants; import org.jumpmind.symmetric.model.FileSnapshot; import org.jumpmind.symmetric.model.FileSnapshot.LastEventType; import org.jumpmind.symmetric.model.FileTriggerRouter; diff --git a/symmetric-core/src/main/java/org/jumpmind/symmetric/route/DBFRouter.java b/symmetric-core/src/main/java/org/jumpmind/symmetric/route/DBFRouter.java index 88f37a8489..d6897b3474 100644 --- a/symmetric-core/src/main/java/org/jumpmind/symmetric/route/DBFRouter.java +++ b/symmetric-core/src/main/java/org/jumpmind/symmetric/route/DBFRouter.java @@ -31,15 +31,16 @@ public List parse(File file, int lineNumber) { List rows = new ArrayList(); InputStream fileInputStream = null; + int currentLine = 1; try { boolean validateHeader = engine.getParameterService() .is(ParameterConstants.DBF_ROUTER_VALIDATE_HEADER, true); fileInputStream = Files.newInputStream(file.toPath(), StandardOpenOption.READ); dbfReader = new DBFReader(fileInputStream, validateHeader); - int currentLine = 1; + while (dbfReader.hasNextRecord()) { - StringBuffer row = new StringBuffer(); + StringBuilder row = new StringBuilder(); Object[] record = dbfReader.nextRecord(); if (currentLine > lineNumber) { for (int i = 0; i < record.length; i++) { @@ -53,7 +54,7 @@ public List parse(File file, int lineNumber) { } } catch (Exception e) { - log.error("Unable to parse DBF file " + file.getName(), e); + log.error("Unable to parse DBF file " + file.getName() + " line number " + currentLine, e); } finally { if (fileInputStream != null) { diff --git a/symmetric-core/src/main/java/org/jumpmind/symmetric/route/parse/DBFReader.java b/symmetric-core/src/main/java/org/jumpmind/symmetric/route/parse/DBFReader.java index fd8ccf1a92..ba53b96885 100644 --- a/symmetric-core/src/main/java/org/jumpmind/symmetric/route/parse/DBFReader.java +++ b/symmetric-core/src/main/java/org/jumpmind/symmetric/route/parse/DBFReader.java @@ -3,13 +3,19 @@ import java.io.*; import java.nio.charset.Charset; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + public class DBFReader { + static final Logger log = LoggerFactory.getLogger(DBFReader.class); + private DataInputStream stream; private DBFField fields[]; private byte nextRecord[]; private int nFieldCount; private boolean validate; + private int lineNumber; public DBFReader(String s, boolean validate) throws DBFException { stream = null; @@ -153,13 +159,19 @@ public boolean hasNextRecord() { public Object[] nextRecord() throws DBFException { if (!hasNextRecord()) throw new DBFException("No more records available."); + lineNumber++; Object aobj[] = new Object[nFieldCount]; int i = 1; for (int j = 0; j < aobj.length; j++) { int k = fields[j].getLength(); StringBuffer stringbuffer = new StringBuffer(k); stringbuffer.append(new String(nextRecord, i, k)); - aobj[j] = fields[j].parse(stringbuffer.toString()); + try { + aobj[j] = fields[j].parse(stringbuffer.toString()); + } catch (DBFException e) { + log.error("Failed to parse field " + (j+1) + " on line " + lineNumber + " with that had a value of " + stringbuffer); + throw e; + } i += fields[j].getLength(); } From 9bb3123ac3c0895ca1aa199a84052b8eafcfdc0b Mon Sep 17 00:00:00 2001 From: mmichalek Date: Tue, 30 May 2017 18:34:05 -0400 Subject: [PATCH 4/5] 0003130: Guard against case mismatches in trigger id's and router id's when doing table reloads --- .../jumpmind/symmetric/service/impl/DataService.java | 12 ++++++++++-- 1 file changed, 10 insertions(+), 2 deletions(-) diff --git a/symmetric-core/src/main/java/org/jumpmind/symmetric/service/impl/DataService.java b/symmetric-core/src/main/java/org/jumpmind/symmetric/service/impl/DataService.java index 36c9c0813a..a3d148d113 100644 --- a/symmetric-core/src/main/java/org/jumpmind/symmetric/service/impl/DataService.java +++ b/symmetric-core/src/main/java/org/jumpmind/symmetric/service/impl/DataService.java @@ -35,6 +35,7 @@ import java.util.Map; import java.util.Set; +import org.apache.commons.collections.map.CaseInsensitiveMap; import org.apache.commons.io.IOUtils; import org.apache.commons.lang.NotImplementedException; import org.apache.commons.lang.StringEscapeUtils; @@ -54,6 +55,7 @@ import org.jumpmind.db.sql.mapper.NumberMapper; import org.jumpmind.exception.IoException; import org.jumpmind.symmetric.ISymmetricEngine; +import org.jumpmind.symmetric.SymmetricException; import org.jumpmind.symmetric.common.Constants; import org.jumpmind.symmetric.common.ParameterConstants; import org.jumpmind.symmetric.common.TableConstants; @@ -526,11 +528,12 @@ public void insertReloadEvents(Node targetNode, boolean reverse, List convertReloadListToMap(List reloadRequests) { if (reloadRequests == null) { return null; } - Map reloadMap = new HashMap(); + Map reloadMap = new CaseInsensitiveMap(); for (TableReloadRequest item : reloadRequests) { reloadMap.put(item.getIdentifier(), item); } @@ -631,7 +634,12 @@ private void insertSqlEventsPriorToReload(Node targetNode, String nodeIdRecord, List triggerRouters = triggerRoutersByHistoryId.get(triggerHistory .getTriggerHistoryId()); for (TriggerRouter triggerRouter : triggerRouters) { - TableReloadRequest currentRequest = reloadRequests.get(triggerRouter.getTriggerId() + triggerRouter.getRouterId()); + String key = triggerRouter.getTriggerId() + triggerRouter.getRouterId(); + TableReloadRequest currentRequest = reloadRequests.get(key); + if (currentRequest == null) { + throw new SymmetricException("Could not locate table reload request for key '" + key + + "'. Available requests are: " + reloadRequests.keySet()); + } beforeSql = currentRequest.getBeforeCustomSql(); if (isNotBlank(beforeSql)) { From cf772e2bd4bb3d29ab427fd1eb896e2d26b1f41b Mon Sep 17 00:00:00 2001 From: Chris Henson Date: Wed, 31 May 2017 10:02:53 -0400 Subject: [PATCH 5/5] 0003131: null pointer when a table reload request is queued up and there is no sym_node_security row --- .../org/jumpmind/symmetric/service/impl/RouterService.java | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/symmetric-core/src/main/java/org/jumpmind/symmetric/service/impl/RouterService.java b/symmetric-core/src/main/java/org/jumpmind/symmetric/service/impl/RouterService.java index a77a890778..8b4a4b8612 100644 --- a/symmetric-core/src/main/java/org/jumpmind/symmetric/service/impl/RouterService.java +++ b/symmetric-core/src/main/java/org/jumpmind/symmetric/service/impl/RouterService.java @@ -329,8 +329,8 @@ public void processTableRequestLoads(Node source, ProcessInfo processInfo) { else { NodeSecurity targetNodeSecurity = engine.getNodeService().findNodeSecurity(load.getTargetNodeId()); - boolean registered = targetNodeSecurity.getRegistrationTime() != null - || targetNodeSecurity.getNodeId().equals(targetNodeSecurity.getCreatedAtNodeId()); + boolean registered = targetNodeSecurity != null && (targetNodeSecurity.getRegistrationTime() != null + || targetNodeSecurity.getNodeId().equals(targetNodeSecurity.getCreatedAtNodeId())); if (registered) { // Make loads unique to the target and create time String key = load.getTargetNodeId() + "::" + load.getCreateTime().toString(); @@ -338,6 +338,8 @@ public void processTableRequestLoads(Node source, ProcessInfo processInfo) { requestsSplitByLoad.put(key, new ArrayList()); } requestsSplitByLoad.get(key).add(load); + } else { + log.warn("There was a load queued up for '{}', but the node is not registered. It is being ignored", load.getTargetNodeId()); } } }