/*
* Copyright (C) 2013 Red Hat, Inc. and/or its affiliates.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.jboss.errai.cdi.demo.tagcloud.client.shared;
import java.util.Collections;
import java.util.Date;
import java.util.HashMap;
import java.util.HashSet;
import java.util.Map;
import java.util.Set;
import org.jboss.errai.common.client.api.annotations.Portable;
import org.jboss.errai.enterprise.client.cdi.api.Conversational;
/**
* This class represents a tag cloud.
*
* @author Christian Sadilek <csadilek@redhat.com>
*/
@Portable
@Conversational
public class TagCloud {
private Map<String, Tag> tags;
private Integer minFrequency = -1;
private Integer maxFrequency = -1;
public TagCloud() {
tags = new HashMap<String, Tag>();
}
public TagCloud(Set<Tag> tags) {
setAllTags(tags);
}
public Tag getTag(String name) {
return tags.get(name);
}
public boolean addTag(Tag tag) {
if (tag == null)
throw new IllegalArgumentException("Tag must not be null");
tags.put(tag.getName(), tag);
return updateMinMaxFrequency(tag);
}
public boolean updateTag(Tag tag) {
if (tag == null)
throw new IllegalArgumentException("Tag must not be null");
tag.setCreated(new Date());
boolean needsRefresh = updateMinMaxFrequency(tag);
Tag oldTag = tags.put(tag.getName(), tag);
if (oldTag != null && ((oldTag.getFrequency() == maxFrequency) || oldTag.getFrequency() == minFrequency)) {
needsRefresh = true;
refreshMinMaxFrequency();
}
return needsRefresh;
}
public boolean removeTag(Tag tag) {
if (tag == null)
throw new IllegalArgumentException("Tag must not be null");
Tag oldTag = tags.remove(tag.getName());
boolean needsRefresh =
(oldTag != null && (oldTag.getFrequency() == maxFrequency || oldTag.getFrequency() == minFrequency));
if (needsRefresh) {
refreshMinMaxFrequency();
}
return needsRefresh;
}
public Double getTagWeight(Tag tag) {
if (tag == null)
throw new IllegalArgumentException("Tag must not be null");
return (Math.log(tag.getFrequency()) - Math.log(minFrequency)) / (Math.log(maxFrequency) - Math.log(minFrequency));
}
public Set<Tag> getAllTags() {
if (tags == null)
return Collections.unmodifiableSet(new HashSet<Tag>());
return Collections.unmodifiableSet(new HashSet<Tag>(tags.values()));
}
public void setAllTags(Set<Tag> tagSet) {
if (tagSet == null)
throw new IllegalArgumentException("Tags must not be null");
if (tags == null)
tags = new HashMap<String, Tag>();
for (Tag tag : tagSet) {
tags.put(tag.getName(), tag);
updateMinMaxFrequency(tag);
}
}
public Map<String, Tag> getTags() {
if (tags == null)
return Collections.unmodifiableMap(new HashMap<String, Tag>());
return Collections.unmodifiableMap(tags);
}
public void setTags(Map<String, Tag> tags) {
this.tags = tags;
}
public int getMinFrequency() {
return minFrequency;
}
public void setMinFrequency(Integer minFrequency) {
this.minFrequency = minFrequency;
}
public int getMaxFrequency() {
return maxFrequency;
}
public void setMaxFrequency(Integer maxFrequency) {
this.maxFrequency = maxFrequency;
}
private boolean updateMinMaxFrequency(Tag tag) {
boolean updated = false;
if (maxFrequency == -1 || tag.getFrequency() > getMaxFrequency()) {
setMaxFrequency(tag.getFrequency());
updated = true;
}
if (minFrequency == -1 || tag.getFrequency() < getMinFrequency() && tag.getFrequency() > 0) {
setMinFrequency(tag.getFrequency());
updated = true;
}
return updated;
}
private void refreshMinMaxFrequency() {
minFrequency = -1;
maxFrequency = -1;
for (Tag tag : this.tags.values()) {
updateMinMaxFrequency(tag);
}
}
}