/**
* Copyright (c) 2010--2011 Red Hat, Inc.
*
* This software is licensed to you under the GNU General Public License,
* version 2 (GPLv2). There is NO WARRANTY for this software, express or
* implied, including the implied warranties of MERCHANTABILITY or FITNESS
* FOR A PARTICULAR PURPOSE. You should have received a copy of GPLv2
* along with this software; if not, see
* http://www.gnu.org/licenses/old-licenses/gpl-2.0.txt.
*
* Red Hat trademarks are not licensed under GPLv2. No permission is
* granted to use or replicate Red Hat trademarks that are incorporated
* in this software or its documentation.
*/
package com.redhat.rhn.frontend.dto;
import com.redhat.rhn.common.localization.LocalizationService;
import com.redhat.rhn.domain.channel.Channel;
import com.redhat.rhn.domain.config.ConfigChannel;
import com.redhat.rhn.domain.entitlement.Entitlement;
import com.redhat.rhn.domain.server.NetworkInterface;
import com.redhat.rhn.domain.server.Server;
import com.redhat.rhn.domain.server.ServerGroup;
import com.redhat.rhn.domain.server.ServerNetAddress6;
import com.redhat.rhn.domain.token.ActivationKey;
import com.redhat.rhn.domain.user.User;
import com.redhat.rhn.manager.entitlement.EntitlementManager;
import com.redhat.rhn.manager.token.ActivationKeyManager;
import org.apache.commons.lang.StringUtils;
import java.util.Collection;
import java.util.Collections;
import java.util.HashMap;
import java.util.LinkedList;
import java.util.List;
import java.util.Map;
import java.util.Set;
/**
* SystemCompareDto
* @version $Rev$
*/
public class SystemCompareDto {
private List<Server> servers;
private User user;
/**
* Constructor to setup System Compare objects
* @param systems the list of systems to compare
* @param u the user object
*/
public SystemCompareDto(List<Server> systems, User u) {
servers = systems;
user = u;
}
/**
* list of nicely formatted last checkin dates in the same order
* as the systems were added
* @return the last checkin dates
*/
public List<Item> getLastCheckinDates() {
LocalizationService ls = LocalizationService.getInstance();
List<String> ret = new LinkedList<String>();
for (Server server : servers) {
ret.add(ls.formatDate(server.getLastCheckin()));
}
return compare(ret);
}
/**
* @return the list of servers being compared
*/
public List<Server> getServers() {
return servers;
}
/**
* @return the number of servers
*/
public int getSize() {
return servers.size();
}
private List<List<Item>> compareList(List<List> lists) {
return compareList(lists, Collections.EMPTY_MAP);
}
/**
* Call this compare things lists of tuples like
* [ [1,2,3] . [5,2], [9] ] ->
* Note we expect unique set of items
* @param lists lists of tuples
* @param idMap a map of value : id if its needed
* @return a List of List of items
*/
private List<List<Item>> compareList(List<List> lists, Map<String, String> idMap) {
List<List<Item>> compared = new LinkedList<List<Item>>();
Map<String, Integer> similarity = new HashMap<String, Integer>();
for (List list : lists) {
List<Item> itemized = new LinkedList<Item>();
for (Object o : list) {
String s = (o != null) ? String.valueOf(o).trim() : "";
Item i = new Item();
i.value = s;
itemized.add(i);
if (!similarity.containsKey(s)) {
similarity.put(s, 0);
}
similarity.put(s, similarity.get(s) + 1);
}
compared.add(itemized);
}
for (List<Item> items : compared) {
for (Item item : items) {
item.similar = !StringUtils.isBlank(item.value) &&
similarity.get(item.value) > 1;
item.id = idMap.get(item.value);
}
}
return compared;
}
private List<Item> compare(List strings) {
return compare(strings, Collections.EMPTY_MAP);
}
private List<Item> compare(List strings, Map<String, String> idMap) {
List<Item> compared = new LinkedList<Item>();
Map<String, Integer> similarity = new HashMap<String, Integer>();
for (Object o : strings) {
String s = (o != null) ? String.valueOf(o).trim() : "";
Item i = new Item();
i.value = s;
compared.add(i);
if (!similarity.containsKey(s)) {
similarity.put(s, 0);
}
similarity.put(s, similarity.get(s) + 1);
}
for (Item item : compared) {
item.similar = !StringUtils.isBlank(item.value) &&
similarity.get(item.value) > 1;
item.id = idMap.get(item.value);
}
return compared;
}
/**
* Returns a list of ( mac addresses available per system)
* The similar items will be marked accordingly
* @return a list of Mac addresses per system
*/
public List<List<Item>> getMacAddresses() {
List<List> addresses = new LinkedList<List>();
for (Server system : servers) {
addresses.add(getMacAddresses(system));
}
return compareList(addresses);
}
/**
* Returns a list of ( ip addresses available per system)
* @return a list of ip addresses per system
*/
public List<List<Item>> getIpAddresses() {
List<List> addresses = new LinkedList<List>();
for (Server system : servers) {
addresses.add(getIpAddresses(system));
}
return compareList(addresses);
}
/**
* Returns a list of ( ipv6 addresses available per system)
* @return a list of ip addresses per system
*/
public List<List<Item>> getIpv6Addresses() {
List<List> addresses = new LinkedList<List>();
for (Server system : servers) {
addresses.add(getIpv6Addresses(system));
}
return compareList(addresses);
}
/**
* Returns a list of (system groups available per system)
* @return a list of system groups per system
*/
public List<List<Item>> getSystemGroups() {
List<List> groups = new LinkedList<List>();
Map <String, String> idMap = new HashMap<String, String>();
for (Server system : servers) {
List sysGroups = new LinkedList();
for (ServerGroup sg : system.getManagedGroups()) {
sysGroups.add(sg.getName());
idMap.put(sg.getName(), sg.getId().toString());
}
groups.add(sysGroups);
}
return compareList(groups, idMap);
}
/**
* List of registration dates in the same order as the system list passed in
* @return the list of registration dates
*/
public List<Item> getRegistrationDates() {
LocalizationService ls = LocalizationService.getInstance();
List<String> dates = new LinkedList<String>();
for (Server s : servers) {
dates.add(ls.formatDate(s.getCreated()));
}
return compare(dates);
}
/**
* List of system ids in the same order as the system list passed in
* @return the list of system ids
*/
public List<Item> getSystemIds() {
List<String> ids = new LinkedList<String>();
for (Server s : servers) {
ids.add(s.getId().toString());
}
return compare(ids);
}
/**
* List of base channels in the same order as the system list passed in
* @return the list of base channels
*/
public List<Item> getBaseChannels() {
List<String> ids = new LinkedList<String>();
Map <String, String> idMap = new HashMap<String, String>();
for (Server s : servers) {
if (s.getBaseChannel() != null) {
ids.add(s.getBaseChannel().getName());
idMap.put(s.getBaseChannel().getName(),
s.getBaseChannel().getId().toString());
}
else {
ids.add("");
}
}
return compare(ids, idMap);
}
/**
* Returns a list of (child channels per system)
* @return a list of child channels per system
*/
public List<List<Item>> getChildChannels() {
List<List> ret = new LinkedList<List>();
Map <String, String> idMap = new HashMap<String, String>();
for (Server system : servers) {
List keys = new LinkedList();
Set<Channel> childChannels = system.getChildChannels();
if (childChannels != null) {
for (Channel channel : childChannels) {
keys.add(channel.getName());
idMap.put(channel.getName(), channel.getId().toString());
}
}
ret.add(keys);
}
return compareList(ret, idMap);
}
/**
* Returns a list of (configuration channels per system)
* @return a list of configuration channels per system
*/
public List<List<Item>> getConfigChannels() {
List<List> ret = new LinkedList<List>();
Map <String, String> idMap = new HashMap<String, String>();
for (Server system : servers) {
List keys = new LinkedList();
if (system.getConfigChannelCount() > 0) {
Collection<ConfigChannel> channels = system.getConfigChannels();
if (channels != null) {
for (ConfigChannel channel : channels) {
keys.add(channel.getName());
idMap.put(channel.getName(), channel.getId().toString());
}
}
}
ret.add(keys);
}
return compareList(ret, idMap);
}
/**
* Returns a list of (system addon entitlements per system)
* @return a list of system add-on entitlements per system
*/
public List<List<Item>> getSystemEntitlements() {
List<List> ret = new LinkedList<List>();
for (Server system : servers) {
List keys = new LinkedList();
if (!system.getEntitlements().isEmpty()) {
if (system.getAddOnEntitlements().isEmpty()) {
keys.add(EntitlementManager.MANAGEMENT.getHumanReadableTypeLabel());
}
else {
for (Entitlement ent : system.getAddOnEntitlements()) {
keys.add(ent.getHumanReadableLabel());
}
}
}
else {
LocalizationService ls = LocalizationService.getInstance();
keys.add(ls.getMessage("Unentitled"));
}
ret.add(keys);
}
return compareList(ret);
}
/**
* Returns a list of (channel family entitlements per system)
* @return a list of channel family entitlements per system
*/
public List<List<Item>> getSoftwareEntitlements() {
List<List> ret = new LinkedList<List>();
for (Server system : servers) {
List keys = new LinkedList();
if (system.getBaseChannel() != null && !system.getBaseChannel().isCustom()) {
keys.add(system.getBaseChannel().getChannelFamily().getName());
}
if (system.getChildChannels() != null) {
for (Channel channel : system.getChildChannels()) {
if (!channel.isCustom()) {
keys.add(channel.getChannelFamily().getName());
}
}
}
ret.add(keys);
}
return compareList(ret);
}
/**
* Returns a list of (activation keys used per system)
* @return a list of activation keys used per system
*/
public List<List<Item>> getActivationKeys() {
List<List> ret = new LinkedList<List>();
Map <String, String> idMap = new HashMap<String, String>();
ActivationKeyManager akm = ActivationKeyManager.getInstance();
for (Server system : servers) {
List keys = new LinkedList();
for (ActivationKey ak : akm.findByServer(system, user)) {
keys.add(ak.getKey());
idMap.put(ak.getKey(), ak.getToken().getId().toString());
}
ret.add(keys);
}
return compareList(ret, idMap);
}
private List<String> getMacAddresses(Server system) {
List<String> macs = new LinkedList<String>();
for (NetworkInterface n : system.getNetworkInterfaces()) {
String addr = n.getIpaddr();
if (addr != null &&
!addr.equals("127.0.0.1")) {
macs.add(n.getHwaddr());
}
}
return macs;
}
private List<String> getIpAddresses(Server system) {
List<String> macs = new LinkedList<String>();
for (NetworkInterface n : system.getNetworkInterfaces()) {
String addr = n.getIpaddr();
if (addr != null &&
!addr.equals("127.0.0.1")) {
macs.add(addr);
}
}
return macs;
}
private List<String> getIpv6Addresses(Server system) {
List<String> addrs = new LinkedList<String>();
for (NetworkInterface n : system.getNetworkInterfaces()) {
for (ServerNetAddress6 ad6 : n.getIPv6Addresses()) {
String addr = ad6.getAddress();
if (addr != null && !addr.equals("::1")) {
addrs.add(addr);
}
}
}
return addrs;
}
/**
* An item object to represent
* value/ id/ and similarity
* Item
* @version $Rev$
*/
public static class Item {
private String value;
private boolean similar;
private String id;
/**
* @return Returns the value.
*/
public String getValue() {
return value;
}
/**
* @return Returns the similar.
*/
public boolean isSimilar() {
return similar;
}
/**
* @return Returns the id.
*/
public String getId() {
return id;
}
}
}