diff options
| author | Shireesh Anjal <shireesh@gluster.com> | 2011-07-01 20:29:40 +0530 |
|---|---|---|
| committer | Shireesh Anjal <shireesh@gluster.com> | 2011-07-04 23:07:24 +0530 |
| commit | 428b944c60244d4a7dd37fb69ae125272525d7ea (patch) | |
| tree | 612207c63d8364d5613b17e28a733787d0d9906c /src/com.gluster.storage.management.core | |
| parent | e8f611c7d7f448e7a815c723f90b2f85d96ae300 (diff) | |
Task#111 - Auto-refresh of data in views
Diffstat (limited to 'src/com.gluster.storage.management.core')
12 files changed, 302 insertions, 193 deletions
diff --git a/src/com.gluster.storage.management.core/src/com/gluster/storage/management/core/model/Brick.java b/src/com.gluster.storage.management.core/src/com/gluster/storage/management/core/model/Brick.java index fef8f969..0b330514 100644 --- a/src/com.gluster.storage.management.core/src/com/gluster/storage/management/core/model/Brick.java +++ b/src/com.gluster.storage.management.core/src/com/gluster/storage/management/core/model/Brick.java @@ -19,6 +19,7 @@ package com.gluster.storage.management.core.model; import javax.xml.bind.annotation.XmlRootElement; +import javax.xml.bind.annotation.XmlTransient; import com.gluster.storage.management.core.utils.StringUtil; @@ -35,6 +36,12 @@ public class Brick extends Entity { public Brick() { } + @Override + @XmlTransient + public String getName() { + return getQualifiedName(); + } + public BRICK_STATUS getStatus() { return status; } @@ -83,7 +90,7 @@ public class Brick extends Entity { } public boolean filter(String filterString, boolean caseSensitive) { - return StringUtil.filterString(getServerName() + getBrickDirectory() + getDiskName(), filterString, + return StringUtil.filterString(getServerName() + getBrickDirectory() + getDiskName() + getStatusStr(), filterString, caseSensitive); } @@ -91,4 +98,25 @@ public class Brick extends Entity { public String toString() { return getQualifiedName(); } + + @Override + public boolean equals(Object obj) { + if(!(obj instanceof Brick)) { + return false; + } + + Brick brick = (Brick)obj; + if(getQualifiedName().equals(brick.getQualifiedName()) && getStatus() == brick.getStatus()) { + return true; + } + + return false; + } + + public void copyFrom(Brick newBrick) { + setServerName(newBrick.getServerName()); + setBrickDirectory(newBrick.getBrickDirectory()); + setDiskName(newBrick.getDiskName()); + setStatus(newBrick.getStatus()); + } } diff --git a/src/com.gluster.storage.management.core/src/com/gluster/storage/management/core/model/ClusterListener.java b/src/com.gluster.storage.management.core/src/com/gluster/storage/management/core/model/ClusterListener.java index 71de5e23..350c9102 100644 --- a/src/com.gluster.storage.management.core/src/com/gluster/storage/management/core/model/ClusterListener.java +++ b/src/com.gluster.storage.management.core/src/com/gluster/storage/management/core/model/ClusterListener.java @@ -27,6 +27,8 @@ public interface ClusterListener { public void discoveredServerRemoved(Server server); + public void discoveredServerChanged(Server server, Event event); + public void serverAdded(GlusterServer server); public void serverRemoved(GlusterServer server); diff --git a/src/com.gluster.storage.management.core/src/com/gluster/storage/management/core/model/DefaultClusterListener.java b/src/com.gluster.storage.management.core/src/com/gluster/storage/management/core/model/DefaultClusterListener.java index d3b0e42e..c530fde4 100644 --- a/src/com.gluster.storage.management.core/src/com/gluster/storage/management/core/model/DefaultClusterListener.java +++ b/src/com.gluster.storage.management.core/src/com/gluster/storage/management/core/model/DefaultClusterListener.java @@ -26,79 +26,83 @@ public class DefaultClusterListener implements ClusterListener { @Override public void serverAdded(GlusterServer server) { - clusterChanged(); + modelChanged(); } @Override public void serverRemoved(GlusterServer server) { - clusterChanged(); + modelChanged(); } @Override public void serverChanged(GlusterServer server, Event event) { - clusterChanged(); + modelChanged(); } @Override public void volumeAdded(Volume volume) { - clusterChanged(); + modelChanged(); } @Override public void volumeRemoved(Volume volume) { - clusterChanged(); + modelChanged(); } @Override public void volumeChanged(Volume volume, Event event) { - clusterChanged(); + modelChanged(); } @Override public void discoveredServerAdded(Server server) { - clusterChanged(); + modelChanged(); } @Override public void discoveredServerRemoved(Server server) { - clusterChanged(); + modelChanged(); } @Override public void volumeCreated(Volume volume) { - clusterChanged(); + modelChanged(); } @Override public void volumeDeleted(Volume volume) { - clusterChanged(); + modelChanged(); } @Override public void taskAdded(TaskInfo taskInfo) { - clusterChanged(); + modelChanged(); } @Override public void taskRemoved(TaskInfo taskInfo) { - clusterChanged(); + modelChanged(); } @Override public void taskUpdated(TaskInfo taskInfo) { - clusterChanged(); + modelChanged(); } - + /** * This method is called by every other event method. Thus, if a view/listener is interested in performing the same - * task on any change happening in the cluster data model, it can simply override this method and implement the - * logic. e.g. A view may simply refresh its tree/table viewer whenever the cluster data model changes. + * task on any change happening in the data model, it can simply override this method and implement the + * logic. e.g. A view may simply refresh its tree/table viewer whenever the data model changes. */ - public void clusterChanged() { + public void modelChanged() { } - + + @Override + public void discoveredServerChanged(Server server, Event event) { + modelChanged(); + } } diff --git a/src/com.gluster.storage.management.core/src/com/gluster/storage/management/core/model/Disk.java b/src/com.gluster.storage.management.core/src/com/gluster/storage/management/core/model/Disk.java index a399a03a..ecc3a278 100644 --- a/src/com.gluster.storage.management.core/src/com/gluster/storage/management/core/model/Disk.java +++ b/src/com.gluster.storage.management.core/src/com/gluster/storage/management/core/model/Disk.java @@ -132,4 +132,31 @@ public class Disk extends Entity { public String getQualifiedBrickName(String volumeName) { return getServerName() + ":" + getMountPoint() + File.separator + volumeName; } -} + + @Override + public boolean equals(Object obj) { + if(!(obj instanceof Disk)) { + return false; + } + Disk disk = (Disk)obj; + + if (getName().equals(disk.getName()) && getServerName().equals(disk.getServerName()) + && getMountPoint().equals(disk.getMountPoint()) && getDescription().equals(disk.getDescription()) + && getStatus() == disk.getStatus() && getSpace() == disk.getSpace() + && getSpaceInUse() == disk.getSpaceInUse()) { + return true; + } + + return false; + } + + public void copyFrom(Disk newDisk) { + setName(newDisk.getName()); + setDescription(newDisk.getDescription()); + setMountPoint(newDisk.getMountPoint()); + setServerName(newDisk.getServerName()); + setStatus(newDisk.getStatus()); + setSpace(newDisk.getSpace()); + setSpaceInUse(newDisk.getSpaceInUse()); + } +}
\ No newline at end of file diff --git a/src/com.gluster.storage.management.core/src/com/gluster/storage/management/core/model/Event.java b/src/com.gluster.storage.management.core/src/com/gluster/storage/management/core/model/Event.java index 1e172d1c..62f70040 100644 --- a/src/com.gluster.storage.management.core/src/com/gluster/storage/management/core/model/Event.java +++ b/src/com.gluster.storage.management.core/src/com/gluster/storage/management/core/model/Event.java @@ -22,12 +22,17 @@ public class Event { public enum EVENT_TYPE { BRICKS_ADDED, BRICKS_REMOVED, + BRICKS_CHANGED, BRICK_REPLACED, - NETWORK_INTERFACE_ADDED, - NETWORK_INTERFACE_REMOVED, VOLUME_STATUS_CHANGED, VOLUME_OPTIONS_RESET, - VOLUME_OPTION_SET + VOLUME_OPTION_SET, + VOLUME_CHANGED, + GLUSTER_SERVER_CHANGED, + DISKS_ADDED, + DISKS_REMOVED, + DISKS_CHANGED, + DISCOVERED_SERVER_CHANGED } private EVENT_TYPE eventType; diff --git a/src/com.gluster.storage.management.core/src/com/gluster/storage/management/core/model/GlusterDummyModel.java b/src/com.gluster.storage.management.core/src/com/gluster/storage/management/core/model/GlusterDummyModel.java index 8324b22d..f2ccc5db 100644 --- a/src/com.gluster.storage.management.core/src/com/gluster/storage/management/core/model/GlusterDummyModel.java +++ b/src/com.gluster.storage.management.core/src/com/gluster/storage/management/core/model/GlusterDummyModel.java @@ -88,7 +88,6 @@ public class GlusterDummyModel { initializeAutoDiscoveredServers(cluster); initializeDisks(); addDisksToServers(); - addDisksToVolumes(); addVolumeOptions(); createDummyLogMessages(); @@ -170,27 +169,6 @@ public class GlusterDummyModel { server5.addDisk(s5db); } - private void addDisksToVolumes() { - volume1.addDisk("server1:sda"); - - volume2.addDisk("server2:sda"); - volume2.addDisk("server1:sdb"); - volume2.addDisk("server3:sda"); - volume2.addDisk("server4:sda"); - - volume3.addDisk("server2:sdb"); - volume3.addDisk("server4:sda"); - volume3.addDisk("server5:sda"); - - volume4.addDisk("server1:sda"); - volume4.addDisk("server3:sda"); - volume4.addDisk("server4:sda"); - volume4.addDisk("server5:sdb"); - - volume5.addDisk("server2:sda"); - volume5.addDisk("server5:sdb"); - } - private void initializeGlusterServers(Cluster cluster) { List<GlusterServer> servers = new ArrayList<GlusterServer>(); server1 = addGlusterServer(servers, cluster, "Server1", SERVER_STATUS.ONLINE, "eth0", 4, 56.3, 16, 8.4); @@ -254,33 +232,6 @@ public class GlusterDummyModel { return null; } - public List<Disk> getReadyDisksOfVolume(Volume volume) { - // List<Disk> disks = new ArrayList<Disk>(); - // for (Disk disk : volume.getDisks()) { - // if (disk.isReady()) { - // disks.add(disk); - // } - // } - // return disks; - Disk disk = null; - List<Disk> volumeDisks = new ArrayList<Disk>(); - for (String volumeDisk : volume.getDisks()) { - disk = getVolumeDisk(volumeDisk); - if (disk != null && disk.isReady()) { - volumeDisks.add(disk); - } - } - return volumeDisks; - } - - public List<Disk> getReadyDisksOfAllVolumes() { - List<Disk> disks = new ArrayList<Disk>(); - for (Volume volume : ((Cluster) model.getChildren().get(0)).getVolumes()) { - disks.addAll(getReadyDisksOfVolume(volume)); - } - return disks; - } - public List<Disk> getReadyDisksOfAllServers() { return getReadyDisksOfAllServersExcluding(new ArrayList<Disk>()); } diff --git a/src/com.gluster.storage.management.core/src/com/gluster/storage/management/core/model/GlusterServer.java b/src/com.gluster.storage.management.core/src/com/gluster/storage/management/core/model/GlusterServer.java index a9455f48..d6105f23 100644 --- a/src/com.gluster.storage.management.core/src/com/gluster/storage/management/core/model/GlusterServer.java +++ b/src/com.gluster.storage.management.core/src/com/gluster/storage/management/core/model/GlusterServer.java @@ -33,7 +33,6 @@ public class GlusterServer extends Server { private String uuid; private SERVER_STATUS status; - private Cluster cluster; public GlusterServer() { } @@ -48,12 +47,6 @@ public class GlusterServer extends Server { setStatus(status); } - public GlusterServer(String name, Entity parent, SERVER_STATUS status, int numOfCPUs, double cpuUsage, - double totalMemory, double memoryInUse, Cluster cluster) { - this(name, parent, status, numOfCPUs, cpuUsage, totalMemory, memoryInUse); - setCluster(cluster); - } - public Boolean isOnline() { return getStatus() == SERVER_STATUS.ONLINE; } @@ -78,32 +71,31 @@ public class GlusterServer extends Server { this.uuid = uuid; } - -// public NetworkInterface getPreferredNetworkInterface() { -// return preferredNetworkInterface; -// } -// -// public void setPreferredNetworkInterface(NetworkInterface preferredNetworkInterface) { -// this.preferredNetworkInterface = preferredNetworkInterface; -// preferredNetworkInterface.setPreferred(true); -// } - - - @XmlTransient - public Cluster getCluster() { - return cluster; - } - - public void setCluster(Cluster cluster) { - this.cluster = cluster; - } - /** - * Filter matches if any of the properties name, status and primary/secondary/third - * DNS contains the filter string + * Filter matches if any of the properties name and status contains the filter string */ @Override public boolean filter(String filterString, boolean caseSensitive) { return StringUtil.filterString(getName() + getStatusStr(), filterString, caseSensitive); } -} + + @Override + public boolean equals(Object obj) { + if(!(obj instanceof GlusterServer)) { + return false; + } + GlusterServer server = (GlusterServer)obj; + + if(super.equals(server) && getUuid().equals(server.getUuid()) && getStatus() == server.getStatus()){ + return true; + } + + return false; + } + + public void copyFrom(GlusterServer server) { + super.copyFrom(server); + setUuid(server.getUuid()); + setStatus(server.getStatus()); + } +}
\ No newline at end of file diff --git a/src/com.gluster.storage.management.core/src/com/gluster/storage/management/core/model/NetworkInterface.java b/src/com.gluster.storage.management.core/src/com/gluster/storage/management/core/model/NetworkInterface.java index c0521ef3..181b8e66 100644 --- a/src/com.gluster.storage.management.core/src/com/gluster/storage/management/core/model/NetworkInterface.java +++ b/src/com.gluster.storage.management.core/src/com/gluster/storage/management/core/model/NetworkInterface.java @@ -92,4 +92,21 @@ public class NetworkInterface extends Entity { this.speed = speed; } -} + @Override + public boolean equals(Object obj) { + if (!(obj instanceof NetworkInterface)) { + return false; + } + + NetworkInterface networkInterface = (NetworkInterface) obj; + if (getName().equals(networkInterface.getName()) && getHwAddr().equals(networkInterface.getHwAddr()) + && getIpAddress().equals(networkInterface.getIpAddress()) + && getDefaultGateway().equals(networkInterface.getDefaultGateway()) + && getNetMask().equals(networkInterface.getNetMask()) && getSpeed().equals(networkInterface.getSpeed()) + && getModel().equals(networkInterface.getModel())) { + return true; + } + + return false; + } +}
\ No newline at end of file diff --git a/src/com.gluster.storage.management.core/src/com/gluster/storage/management/core/model/Server.java b/src/com.gluster.storage.management.core/src/com/gluster/storage/management/core/model/Server.java index 487733c3..9e9212dc 100644 --- a/src/com.gluster.storage.management.core/src/com/gluster/storage/management/core/model/Server.java +++ b/src/com.gluster.storage.management.core/src/com/gluster/storage/management/core/model/Server.java @@ -19,17 +19,18 @@ package com.gluster.storage.management.core.model; import java.util.ArrayList; +import java.util.Collection; import java.util.List; import javax.xml.bind.annotation.XmlElement; import javax.xml.bind.annotation.XmlElementWrapper; import javax.xml.bind.annotation.XmlRootElement; +import com.gluster.storage.management.core.utils.GlusterCoreUtil; import com.gluster.storage.management.core.utils.StringUtil; @XmlRootElement(name = "server") public class Server extends Entity { - private List<NetworkInterface> networkInterfaces = new ArrayList<NetworkInterface>(); private int numOfCPUs; private double cpuUsage; private double totalMemory; @@ -37,6 +38,7 @@ public class Server extends Entity { private double totalDiskSpace = 0; private double diskSpaceInUse = 0; private List<Disk> disks = new ArrayList<Disk>(); + private List<NetworkInterface> networkInterfaces = new ArrayList<NetworkInterface>(); public Server() { @@ -143,7 +145,7 @@ public class Server extends Entity { } } - public void addDisks(List<Disk> disks) { + public void addDisks(Collection<Disk> disks) { for (Disk disk : disks) { addDisk(disk); } @@ -184,19 +186,54 @@ public class Server extends Entity { public boolean filter(String filterString, boolean caseSensitive) { return StringUtil.filterString(getName() + getIpAddressesAsString(), filterString, caseSensitive); } - + + /** + * Note: this method doesn't copy the disks. Clients should write separate code to identify added/removed/modified + * disks and update the server disks appropriately. + * + * @param server + */ @SuppressWarnings("unchecked") public void copyFrom(Server server) { - this.setName(server.getName()); - this.setParent(server.getParent()); - this.setChildren(( List<Entity>) server.getChildren()); - this.setNetworkInterfaces(server.getNetworkInterfaces()); - this.setNumOfCPUs(server.getNumOfCPUs()); - this.setCpuUsage(server.getCpuUsage()); - this.setTotalMemory(server.getTotalMemory()); - this.setMemoryInUse(server.getMemoryInUse()); - this.setTotalDiskSpace(server.getTotalDiskSpace()); - this.setDiskSpaceInUse(server.getDiskSpaceInUse()); - this.setDisks(server.getDisks()); - } -} + setName(server.getName()); + setParent(server.getParent()); + setChildren((List<Entity>) server.getChildren()); + setNetworkInterfaces(server.getNetworkInterfaces()); + setNumOfCPUs(server.getNumOfCPUs()); + setCpuUsage(server.getCpuUsage()); + setTotalMemory(server.getTotalMemory()); + setMemoryInUse(server.getMemoryInUse()); + setTotalDiskSpace(server.getTotalDiskSpace()); + setDiskSpaceInUse(server.getDiskSpaceInUse()); + } + + @Override + public boolean equals(Object obj) { + if(!(obj instanceof Server)) { + return false; + } + Server server = (Server)obj; + + if (!(getName().equals(server.getName()) && getNumOfCPUs() == server.getNumOfCPUs() + && getCpuUsage() == server.getCpuUsage() && getTotalMemory() == server.getTotalMemory() + && getMemoryInUse() == server.getMemoryInUse() && getDisks().size() == server.getDisks().size() && getNetworkInterfaces() + .size() == server.getNetworkInterfaces().size())) { + return false; + } + + for(Disk disk : getDisks()) { + if (!disk.equals(GlusterCoreUtil.getEntity(server.getDisks(), disk.getName(), false))) { + return false; + } + } + + for (NetworkInterface networkInterface : getNetworkInterfaces()) { + if (!networkInterface.equals(GlusterCoreUtil.getEntity(server.getNetworkInterfaces(), + networkInterface.getName(), false))) { + return false; + } + } + + return true; + } +}
\ No newline at end of file diff --git a/src/com.gluster.storage.management.core/src/com/gluster/storage/management/core/model/Volume.java b/src/com.gluster.storage.management.core/src/com/gluster/storage/management/core/model/Volume.java index 1d5b2fec..006202fb 100644 --- a/src/com.gluster.storage.management.core/src/com/gluster/storage/management/core/model/Volume.java +++ b/src/com.gluster.storage.management.core/src/com/gluster/storage/management/core/model/Volume.java @@ -20,6 +20,7 @@ package com.gluster.storage.management.core.model; import java.util.ArrayList; import java.util.Arrays; +import java.util.Collection; import java.util.LinkedHashMap; import java.util.LinkedHashSet; import java.util.List; @@ -30,6 +31,7 @@ import javax.xml.bind.annotation.XmlElementWrapper; import javax.xml.bind.annotation.XmlRootElement; import javax.xml.bind.annotation.XmlTransient; +import com.gluster.storage.management.core.utils.GlusterCoreUtil; import com.gluster.storage.management.core.utils.StringUtil; @XmlRootElement @@ -62,16 +64,12 @@ public class Volume extends Entity { private static final String[] STATUS_STR = new String[] { "Online", "Offline" }; private static final String[] NAS_PROTOCOL_STR = new String[] { "Gluster", "NFS" }; - private Cluster cluster; private VOLUME_TYPE volumeType; private TRANSPORT_TYPE transportType; private VOLUME_STATUS status; private int replicaCount; private int stripeCount; private VolumeOptions options = new VolumeOptions(); - - private double totalDiskSpace = 0; - private List<String> disks = new ArrayList<String>(); private List<Brick> bricks = new ArrayList<Brick>(); public Volume() { @@ -105,10 +103,6 @@ public class Volume extends Entity { return STATUS_STR[getStatus().ordinal()]; } - public int getNumOfDisks() { - return disks.size(); - } - public int getNumOfBricks() { return bricks.size(); } @@ -164,15 +158,6 @@ public class Volume extends Entity { this.status = status; } - @XmlTransient - public Cluster getCluster() { - return cluster; - } - - public void setCluster(Cluster cluster) { - this.cluster = cluster; - } - @XmlElementWrapper(name = "nasProtocols") @XmlElement(name = "nasProtocol", type=NAS_PROTOCOL.class) public Set<NAS_PROTOCOL> getNASProtocols() { @@ -214,38 +199,11 @@ public class Volume extends Entity { this.options.setOptionsMap(options); } - public double getTotalDiskSpace() { - return totalDiskSpace; - } - - public List<String> getDisks() { - return disks; - } - - public void addDisk(String disk) { - disks.add(disk); - } - - public void addDisks(List<String> disks) { - for (String disk : disks) { - addDisk(disk); - } - } - - public void removeDisk(String disk) { - disks.remove(disk); - } - - public void removeAllDisks() { - disks.clear(); - totalDiskSpace = 0; - } - public void addBrick(Brick brick) { bricks.add(brick); } - public void addBricks(List<Brick> bricks) { + public void addBricks(Collection<Brick> bricks) { this.bricks.addAll(bricks); } @@ -264,11 +222,6 @@ public class Volume extends Entity { return bricks; } - public void setDisks(List<String> disks) { - removeAllDisks(); - addDisks(disks); - } - public void enableNFS() { nasProtocols.add(NAS_PROTOCOL.NFS); } @@ -284,13 +237,6 @@ public class Volume extends Entity { setStatus(status); } - public Volume(String name, Entity parent, Cluster cluster, VOLUME_TYPE volumeType, TRANSPORT_TYPE transportType, - VOLUME_STATUS status) { - this(name, parent, volumeType, transportType, status); - - setCluster(cluster); - } - /** * Filter matches if any of the properties name, volume type, transport type, status and number of disks contains * the filter string @@ -298,7 +244,7 @@ public class Volume extends Entity { @Override public boolean filter(String filterString, boolean caseSensitive) { return StringUtil.filterString(getName() + getVolumeTypeStr() + getTransportTypeStr() + getStatusStr() - + getNumOfDisks(), filterString, caseSensitive); + + getNumOfBricks(), filterString, caseSensitive); } public List<String> getBrickDirectories() { @@ -308,4 +254,51 @@ public class Volume extends Entity { } return brickDirectories; } -} + + @Override + public boolean equals(Object obj) { + if(!(obj instanceof Volume)) { + return false; + } + + Volume volume = (Volume)obj; + + if (!(getName().equals(volume.getName()) && getVolumeType() == volume.getVolumeType() + && getTransportType() == volume.getTransportType() && getStatus() == volume.getStatus() + && getReplicaCount() == volume.getReplicaCount() && getStripeCount() == volume.getStripeCount()) + && getOptions().equals(volume.getOptions())) { + return false; + } + + for(NAS_PROTOCOL nasProtocol : getNASProtocols()) { + if(!(volume.getNASProtocols().contains(nasProtocol))) { + return false; + } + } + + for (Brick brick : getBricks()) { + if (!(brick.equals(GlusterCoreUtil.getEntity(volume.getBricks(), brick.getName(), false)))) { + return false; + } + } + + return true; + } + + /** + * Note: this method doesn't copy the bricks. Clients should write separate code to identify added/removed/modified + * bricks and update the volume bricks appropriately. + * + * @param newVolume + */ + public void copyFrom(Volume newVolume) { + setName(newVolume.getName()); + setVolumeType(newVolume.getVolumeType()); + setTransportType(newVolume.getTransportType()); + setStatus(newVolume.getStatus()); + setReplicaCount(newVolume.getReplicaCount()); + setStripeCount(newVolume.getStripeCount()); + setNASProtocols(newVolume.getNASProtocols()); + getOptions().copyFrom(newVolume.getOptions()); + } +}
\ No newline at end of file diff --git a/src/com.gluster.storage.management.core/src/com/gluster/storage/management/core/model/VolumeOptions.java b/src/com.gluster.storage.management.core/src/com/gluster/storage/management/core/model/VolumeOptions.java index f16dd809..f928c241 100644 --- a/src/com.gluster.storage.management.core/src/com/gluster/storage/management/core/model/VolumeOptions.java +++ b/src/com.gluster.storage.management.core/src/com/gluster/storage/management/core/model/VolumeOptions.java @@ -86,4 +86,30 @@ public class VolumeOptions { public boolean containsKey(String key) { return optionsMap.containsKey(key); } -} + + @Override + public boolean equals(Object obj) { + if(!(obj instanceof VolumeOptions)) { + return false; + } + + VolumeOptions options = (VolumeOptions)obj; + if(getOptions().size() != options.size()) { + return false; + } + + for(VolumeOption option : getOptions()) { + if(!(option.getValue().equals(options.get(option.getKey())))) { + return false; + } + } + + return true; + } + + public void copyFrom(VolumeOptions options) { + for(Entry<String, String> entry : options.entrySet()) { + optionsMap.put(entry.getKey(), entry.getValue()); + } + } +}
\ No newline at end of file diff --git a/src/com.gluster.storage.management.core/src/com/gluster/storage/management/core/utils/GlusterCoreUtil.java b/src/com.gluster.storage.management.core/src/com/gluster/storage/management/core/utils/GlusterCoreUtil.java index 76a7fbfc..838612be 100644 --- a/src/com.gluster.storage.management.core/src/com/gluster/storage/management/core/utils/GlusterCoreUtil.java +++ b/src/com.gluster.storage.management.core/src/com/gluster/storage/management/core/utils/GlusterCoreUtil.java @@ -21,7 +21,10 @@ package com.gluster.storage.management.core.utils; import java.util.ArrayList; +import java.util.HashMap; +import java.util.HashSet; import java.util.List; +import java.util.Map; import java.util.Set; import com.gluster.storage.management.core.model.Brick; @@ -48,6 +51,25 @@ public class GlusterCoreUtil { } /** + * Compares the two entity lists and returns the list of entities from first list that have been modified in the second + * + * @param oldEntities + * @param newEntities + * @return List of entities that have been modified + */ + public static <T extends Entity> Map<T, T> getModifiedEntities(List<T> oldEntities, List<T> newEntities) { + Map<T, T> modifiedEntities = new HashMap<T, T>(); + for (T oldEntity : oldEntities) { + T newEntity = getEntity(newEntities, oldEntity.getName(), false); + if(newEntity != null && !oldEntity.equals(newEntity)) { + // old and new entities differ. mark it as modified. + modifiedEntities.put(oldEntity, newEntity); + } + } + return modifiedEntities; + } + + /** * Compares the two entity lists and returns the list of entities present only in the second argument * <code>newEntities</code> * @@ -56,10 +78,11 @@ public class GlusterCoreUtil { * @param caseInsensitive If true, the entity name comparison will be done in case insensitive manner * @return List of entities that are present only in the second argument <code>newEntities</code> */ - public static <T extends Entity> List<T> getAddedEntities(List<T> oldEntities, List<T> newEntities, boolean caseInsensitive) { - List<T> addedEntities = new ArrayList<T>(); - for(T newEntity : newEntities) { - if(!containsEntity(oldEntities, newEntity, caseInsensitive)) { + public static <T extends Entity> Set<T> getAddedEntities(List<T> oldEntities, List<T> newEntities, + boolean caseInsensitive) { + Set<T> addedEntities = new HashSet<T>(); + for (T newEntity : newEntities) { + if (!containsEntity(oldEntities, newEntity, caseInsensitive)) { // old entity list doesn't contain this entity. mark it as new. addedEntities.add(newEntity); } @@ -67,22 +90,26 @@ public class GlusterCoreUtil { return addedEntities; } - public static <T extends Entity> boolean containsEntity(List<T> entityList, Entity searchEntity, boolean caseInsensitive) { - String searchEntityName = searchEntity.getName(); - if(caseInsensitive) { + public static <T extends Entity> boolean containsEntity(List<T> entityList, Entity searchEntity, + boolean caseInsensitive) { + return getEntity(entityList, searchEntity.getName(), caseInsensitive) != null; + } + + public static <T extends Entity> T getEntity(List<T> entityList, String searchEntityName, boolean caseInsensitive) { + if (caseInsensitive) { searchEntityName = searchEntityName.toUpperCase(); } - - for(T entity : entityList) { + + for (T entity : entityList) { String nextEntityName = entity.getName(); - if(caseInsensitive) { + if (caseInsensitive) { nextEntityName = nextEntityName.toUpperCase(); } - if(nextEntityName.equals(searchEntityName)) { - return true; + if (nextEntityName.equals(searchEntityName)) { + return entity; } } - - return false; + + return null; } } |
