Skip to content

Commit

Permalink
fix: demonstrate refactoring duplicate code using generics
Browse files Browse the repository at this point in the history
  • Loading branch information
rhwood committed May 20, 2020
1 parent 3052923 commit 3b4ea83
Show file tree
Hide file tree
Showing 4 changed files with 78 additions and 16 deletions.
18 changes: 13 additions & 5 deletions java/src/jmri/jmrix/ecos/swing/EcosNamedPaneAction.java
@@ -1,7 +1,12 @@
package jmri.jmrix.ecos.swing;

import java.util.Arrays;
import java.util.HashSet;
import java.util.Set;
import javax.swing.Icon;
import jmri.jmrix.SystemConnectionMemo;
import jmri.jmrix.ecos.EcosSystemConnectionMemo;
import jmri.jmrix.swing.SystemConnectionNamedPaneAction;
import jmri.util.swing.JmriPanel;
import jmri.util.swing.WindowInterface;
import org.slf4j.Logger;
Expand All @@ -12,7 +17,7 @@
*
* @author Bob Jacobsen Copyright (C) 2010
*/
public class EcosNamedPaneAction extends jmri.util.swing.JmriNamedPaneAction {
public class EcosNamedPaneAction extends SystemConnectionNamedPaneAction<EcosSystemConnectionMemo> {

/**
* Enhanced constructor for placing the pane in various GUIs.
Expand All @@ -22,17 +27,15 @@ public class EcosNamedPaneAction extends jmri.util.swing.JmriNamedPaneAction {
* @param memo system connection.
*/
public EcosNamedPaneAction(String s, WindowInterface wi, String paneClass, EcosSystemConnectionMemo memo) {
super(s, wi, paneClass);
super(s, wi, paneClass, memo);
this.memo = memo;
}

public EcosNamedPaneAction(String s, Icon i, WindowInterface wi, String paneClass, EcosSystemConnectionMemo memo) {
super(s, i, wi, paneClass);
super(s, i, wi, paneClass, memo);
this.memo = memo;
}

EcosSystemConnectionMemo memo;

@Override
public JmriPanel makePanel() {
JmriPanel p = super.makePanel();
Expand All @@ -52,4 +55,9 @@ public JmriPanel makePanel() {

private final static Logger log = LoggerFactory.getLogger(EcosNamedPaneAction.class);

@Override
public Set<Class<? extends SystemConnectionMemo>> getSystemConnectionMemoClasses() {
return new HashSet<>(Arrays.asList(EcosSystemConnectionMemo.class));
}

}
21 changes: 13 additions & 8 deletions java/src/jmri/jmrix/nce/swing/NceNamedPaneAction.java
@@ -1,7 +1,12 @@
package jmri.jmrix.nce.swing;

import java.util.Arrays;
import java.util.HashSet;
import java.util.Set;
import javax.swing.Icon;
import jmri.jmrix.SystemConnectionMemo;
import jmri.jmrix.nce.NceSystemConnectionMemo;
import jmri.jmrix.swing.SystemConnectionNamedPaneAction;
import jmri.util.swing.JmriPanel;
import jmri.util.swing.WindowInterface;
import org.slf4j.Logger;
Expand All @@ -13,7 +18,7 @@
* @author Bob Jacobsen Copyright (C) 2010 Copied from LocoNet
* @author kcameron
*/
public class NceNamedPaneAction extends jmri.util.swing.JmriNamedPaneAction {
public class NceNamedPaneAction extends SystemConnectionNamedPaneAction<NceSystemConnectionMemo> {

/**
* Enhanced constructor for placing the pane in various GUIs.
Expand All @@ -24,17 +29,13 @@ public class NceNamedPaneAction extends jmri.util.swing.JmriNamedPaneAction {
* @param memo system connection memo
*/
public NceNamedPaneAction(String s, WindowInterface wi, String paneClass, NceSystemConnectionMemo memo) {
super(s, wi, paneClass);
this.memo = memo;
super(s, wi, paneClass, memo);
}

public NceNamedPaneAction(String s, Icon i, WindowInterface wi, String paneClass, NceSystemConnectionMemo memo) {
super(s, i, wi, paneClass);
this.memo = memo;
super(s, i, wi, paneClass, memo);
}

NceSystemConnectionMemo memo;

@Override
public JmriPanel makePanel() {
JmriPanel p = super.makePanel();
Expand All @@ -52,6 +53,10 @@ public JmriPanel makePanel() {
return p;
}

private final static Logger log = LoggerFactory.getLogger(NceNamedPaneAction.class);
@Override
public Set<Class<? extends SystemConnectionMemo>> getSystemConnectionMemoClasses() {
return new HashSet<>(Arrays.asList(NceSystemConnectionMemo.class));
}

private final static Logger log = LoggerFactory.getLogger(NceNamedPaneAction.class);
}
3 changes: 0 additions & 3 deletions java/src/jmri/jmrix/swing/AbstractSystemConnectionAction.java
Expand Up @@ -32,9 +32,6 @@ public M getSystemConnectionMemo() {

/**
* {@inheritDoc}
* <p>
* Note that this accepts any subclass of SystemConnectionMemo, not just
* subclasses of M, to avoid compilation problems elsewhere.
*
* @throws IllegalArgumentException if the memo is not assignable from any
* class listed in
Expand Down
52 changes: 52 additions & 0 deletions java/src/jmri/jmrix/swing/SystemConnectionNamedPaneAction.java
@@ -0,0 +1,52 @@
package jmri.jmrix.swing;

import javax.swing.Icon;
import jmri.jmrix.SystemConnectionMemo;
import jmri.util.swing.JmriNamedPaneAction;
import jmri.util.swing.WindowInterface;

/**
* {@link JmriNamedPaneAction} that implements {@link SystemConnectionAction}.
*
* @author Randall Wood Copyright 2020
* @param <M> the supported subclass of {@link SystemConnectionMemo}
*/
public abstract class SystemConnectionNamedPaneAction<M extends SystemConnectionMemo> extends JmriNamedPaneAction implements SystemConnectionAction<M> {

protected M memo;

public SystemConnectionNamedPaneAction(String s, String paneClass, M memo) {
super(s, paneClass);
this.memo = memo;
}

public SystemConnectionNamedPaneAction(String s, Icon i, WindowInterface wi, String paneClass, M memo) {
super(s, i, wi, paneClass);
this.memo = memo;
}

public SystemConnectionNamedPaneAction(String s, WindowInterface wi, String paneClass, M memo) {
super(s, wi, paneClass);
this.memo = memo;
}

/**
* {@inheritDoc}
*/
@Override
public M getSystemConnectionMemo() {
return memo;
}

/**
* {@inheritDoc}
*/
@Override
public void setSystemConnectionMemo(M memo) {
if (getSystemConnectionMemoClasses().stream().anyMatch(memo.getClass()::isAssignableFrom)) {
this.memo = memo;
} else {
throw new IllegalArgumentException(memo.getClass() + " is not valid for " + this.getClass());
}
}
}

0 comments on commit 3b4ea83

Please sign in to comment.