package org.limewire.friend.impl;
import java.util.Collections;
import java.util.Date;
import java.util.HashMap;
import java.util.HashSet;
import java.util.Map;
import java.util.Map.Entry;
import java.util.Set;
import java.util.StringTokenizer;
import org.limewire.friend.api.FileMetaData;
import org.limewire.util.Objects;
import org.limewire.util.StringUtils;
public class FileMetaDataImpl implements FileMetaData {
/**
* Keep casing of enum names since they are being sent over the wire
* and xml is case sensitive.
*/
public static enum Element {
id, name, size, description, index, metadata, urns, createTime
}
private static final Element[] MANDATORY_FIELDS = new Element[] {
Element.index, Element.name, Element.size, Element.createTime, Element.urns
};
protected final Map<String, String> data = new HashMap<String, String>();
public FileMetaDataImpl() {}
/**
*
* @throws IllegalArgumentException if data is not complete
*/
public FileMetaDataImpl(FileMetaData metaData) {
setCreateTime(metaData.getCreateTime());
setDescription(metaData.getDescription());
setId(metaData.getId());
setIndex(metaData.getIndex());
setName(metaData.getName());
setSize(metaData.getSize());
setURNs(metaData.getUrns());
if (!isValid()) {
throw new IllegalArgumentException("is missing mandatory fields: " + this);
}
}
/**
*
* @throws IllegalArgumentException if data is not complete
*/
public FileMetaDataImpl(Map<Element, String> data) {
for (Entry<Element, String> entry : data.entrySet()) {
put(entry.getKey(), entry.getValue());
}
if (!isValid()) {
throw new IllegalArgumentException("is missing mandatory fields: " + this);
}
}
protected boolean isValid() {
for (Element element : MANDATORY_FIELDS) {
if (get(element) == null) {
return false;
}
}
try {
getSize();
getIndex();
getCreateTime();
} catch (NumberFormatException nfe) {
return false;
}
return true;
}
private void put(Element element, String value) {
data.put(element.toString(), value);
}
private String get(Element element) {
return data.get(element.toString());
}
public String getId() {
return get(Element.id);
}
public void setId(String id) {
put(Element.id, id);
}
public String getName() {
return get(Element.name);
}
public void setName(String name) {
put(Element.name, Objects.nonNull(name, "name"));
}
public long getSize() {
return Long.valueOf(get(Element.size));
}
public void setSize(long size) {
put(Element.size, Long.toString(size));
}
public String getDescription() {
return get(Element.description);
}
public void setDescription(String description) {
put(Element.description, description);
}
public long getIndex() {
return Long.valueOf(get(Element.index));
}
public void setIndex(long index) {
put(Element.index, Long.toString(index));
}
public Set<String> getUrns() {
StringTokenizer st = new StringTokenizer(get(Element.urns), " ");
Set<String> set = new HashSet<String>();
while(st.hasMoreElements()) {
set.add(st.nextToken());
}
return set;
}
public void setURNs(Set<String> urns) {
put(Element.urns, StringUtils.explode(urns, " "));
}
public Date getCreateTime() {
return new Date(Long.valueOf(get(Element.createTime)));
}
public void setCreateTime(Date date) {
put(Element.createTime, Long.toString(date.getTime()));
}
@Override
public Map<String, String> getSerializableMap() {
return Collections.unmodifiableMap(data);
}
@Override
public String toString() {
return StringUtils.toString(this, data);
}
}