package i5.las2peer.services.ocd.graphs;
import java.awt.Color;
import java.util.HashMap;
import java.util.Map;
import javax.persistence.Column;
import javax.persistence.ElementCollection;
import javax.persistence.Entity;
import javax.persistence.FetchType;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.IdClass;
import javax.persistence.JoinColumn;
import javax.persistence.JoinColumns;
import javax.persistence.ManyToOne;
import javax.persistence.MapKeyJoinColumn;
import javax.persistence.MapKeyJoinColumns;
import javax.persistence.PreRemove;
import y.base.Node;
/**
* Represents a community of a cover.
* @author Sebastian
*
*/
@Entity
@IdClass(CommunityId.class)
public class Community {
/*
* Database column name definitions.
*/
private static final String idColumnName = "ID";
private static final String nameColumnName = "NAME";
private static final String colorColumnName = "COLOR";
public static final String coverIdColumnName = "COVER_ID";
public static final String graphIdColumnName = "GRAPH_ID";
public static final String graphUserColumnName = "USER_NAME";
private static final String membershipMapGraphIdKeyColumnName = "GRAPH_ID";
private static final String membershipMapGraphUserKeyColumnName = "USER_NAME";
private static final String membershipMapNodeIdKeyColumnName = "CUSTOM_NODE_ID";
/**
* System generated persistence id.
*/
@Id
@GeneratedValue(strategy=GenerationType.IDENTITY)
@Column(name = idColumnName)
private long id;
/**
* The cover that the community is part of.
*/
@Id
@ManyToOne
@JoinColumns({
@JoinColumn(name=graphIdColumnName, referencedColumnName=Cover.graphIdColumnName),
@JoinColumn(name=graphUserColumnName, referencedColumnName=Cover.graphUserColumnName),
@JoinColumn(name=coverIdColumnName, referencedColumnName=Cover.idColumnName)
})
private Cover cover;
/**
* The community name.
*/
@Column(name = nameColumnName)
/**
* The community name.
*/
private String name = "";
/**
* The default color of community nodes, defined by the sRGB color model.
*/
@Column(name = colorColumnName)
private int color = Color.WHITE.getRGB();
/**
* A mapping from the community member (custom) nodes to their belonging factors.
* Belonging factors must be non-negative.
*/
@ElementCollection(fetch=FetchType.LAZY)
@MapKeyJoinColumns( {
@MapKeyJoinColumn(name = membershipMapNodeIdKeyColumnName, referencedColumnName = CustomNode.idColumnName),
@MapKeyJoinColumn(name = membershipMapGraphIdKeyColumnName, referencedColumnName = CustomNode.graphIdColumnName),
@MapKeyJoinColumn(name = membershipMapGraphUserKeyColumnName, referencedColumnName = CustomNode.graphUserColumnName)
} )
private Map<CustomNode, Double> memberships = new HashMap<CustomNode, Double>();
/**
* Creates a new instance.
* @param cover The cover the community belongs to.
*/
public Community(Cover cover) {
this.cover = cover;
}
/**
* Creates a new community.
* Only for persistence purposes.
*/
protected Community() {
}
/**
* Getter for id.
* @return The id.
*/
public long getId() {
return id;
}
/**
* Getter for name.
* @return The name.
*/
public String getName() {
return name;
}
/**
* Setter for name.
* @param name The name.
*/
public void setName(String name) {
this.name = name;
}
/**
* Getter for color.
* @return The color.
*/
public Color getColor() {
return new Color(this.color);
}
/**
* Setter for color.
* @param color The color.
*/
public void setColor(Color color) {
this.color = color.getRGB();
}
/**
* Getter for memberships.
* @return The memberships.
*/
public Map<Node, Double> getMemberships() {
Map<Node, Double> memberships = new HashMap<Node, Double> ();
for(Map.Entry<CustomNode, Double> entry : this.memberships.entrySet()) {
memberships.put(this.cover.getGraph().getNode(entry.getKey()), entry.getValue());
}
return memberships;
}
/**
* Setter for a membership entry. If the belonging factor is 0 the node is removed from the community.
* @param node The member node.
* @param belongingFactor The belonging factor.
*/
protected void setBelongingFactor(Node node, double belongingFactor) {
CustomNode customNode = this.cover.getGraph().getCustomNode(node);
if(belongingFactor != 0) {
this.memberships.put(customNode, belongingFactor);
}
else
this.memberships.remove(customNode);
}
/**
* Getter for the belonging factor of a certain node.
* @param node The member node.
* @return The belonging factor, i.e. the corresponding value from the
* memberships map or 0 if the node does not belong to the community.
*/
public double getBelongingFactor(Node node) {
CustomNode customNode = this.cover.getGraph().getCustomNode(node);
Double belongingFactor = this.memberships.get(customNode);
if(belongingFactor == null) {
belongingFactor = 0d;
}
return belongingFactor;
}
/**
* Returns the community size, i.e. the amount of community members.
* @return The size.
*/
public int getSize() {
return this.memberships.size();
}
/////////////////////////// PERSISTENCE CALLBACK METHODS
/*
* PreRemove Method.
* Removes all membership mappings.
*/
@PreRemove
public void preRemove() {
this.memberships.clear();
}
}