package org.richfaces.demo.tree;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import java.util.StringTokenizer;
import org.richfaces.model.TreeNode;
public class Library implements TreeNode {
/**
*
*/
private static final long serialVersionUID = -3530085227471752526L;
private Map artists = null;
private Object state1;
private Object state2;
private Map getArtists() {
if (this.artists==null) {
initData();
}
return this.artists;
}
public void addArtist(Artist artist) {
addChild(Long.toString(artist.getId()), artist);
}
public void addChild(Object identifier, TreeNode child) {
getArtists().put(identifier, child);
child.setParent(this);
}
public TreeNode getChild(Object id) {
return (TreeNode) getArtists().get(id);
}
public Iterator getChildren() {
return getArtists().entrySet().iterator();
}
public Object getData() {
return this;
}
public TreeNode getParent() {
return null;
}
public boolean isLeaf() {
return getArtists().isEmpty();
}
public void removeChild(Object id) {
getArtists().remove(id);
}
public void setData(Object data) {
}
public void setParent(TreeNode parent) {
}
public String getType() {
return "library";
}
private long nextId = 0;
private long getNextId() {
return nextId++;
}
private Map albumCache = new HashMap();
private Map artistCache = new HashMap();
private Artist getArtistByName(String name, Library library) {
Artist artist = (Artist)artistCache.get(name);
if (artist==null) {
artist = new Artist(getNextId());
artist.setName(name);
artistCache.put(name, artist);
library.addArtist(artist);
}
return artist;
}
private Album getAlbumByTitle(String title, Artist artist) {
Album album = (Album)albumCache.get(title);
if (album==null) {
album = new Album(getNextId());
album.setTitle(title);
albumCache.put(title, album);
artist.addAlbum(album);
}
return album;
}
private void initData() {
artists = new HashMap();
InputStream is = this.getClass().getClassLoader().getResourceAsStream("org/richfaces/demo/tree/data.txt");
ByteArrayOutputStream os = new ByteArrayOutputStream();
byte[] rb = new byte[1024];
int read;
try {
do {
read = is.read(rb);
if (read>0) {
os.write(rb, 0, read);
}
} while (read>0);
String buf = os.toString();
StringTokenizer toc1 = new StringTokenizer(buf,"\n");
while (toc1.hasMoreTokens()) {
String str = toc1.nextToken();
StringTokenizer toc2 = new StringTokenizer(str, "\t");
String songTitle = toc2.nextToken();
String artistName = toc2.nextToken();
String albumTitle = toc2.nextToken();
toc2.nextToken();
toc2.nextToken();
String albumYear = toc2.nextToken();
Artist artist = getArtistByName(artistName,this);
Album album = getAlbumByTitle(albumTitle, artist);
album.setYear(new Integer(albumYear));
Song song = new Song(getNextId());
song.setTitle(songTitle);
album.addSong(song);
}
} catch (IOException e) {
throw new RuntimeException(e);
}
}
public Object getState1() {
return state1;
}
public void setState1(Object state1) {
this.state1 = state1;
}
public Object getState2() {
return state2;
}
public void setState2(Object state2) {
this.state2 = state2;
}
public void walk(TreeNode node, List<TreeNode> appendTo, Class<? extends TreeNode> type) {
if (type.isInstance(node)){
appendTo.add(node);
}
Iterator<Map.Entry<Object, TreeNode>> iterator = node.getChildren();
while(iterator.hasNext()) {
walk(iterator.next().getValue(), appendTo, type);
}
}
public ArrayList getLibraryAsList(){
ArrayList appendTo = new ArrayList();
walk(this, appendTo, Song.class);
return appendTo;
}
}