/**
* QuiltPlayer v1.0 Copyright (C) 2008-2009 Vlado Palczynski
* vlado.palczynski@quiltplayer.com http://www.quiltplayer.com This program is
* free software; you can redistribute it and/or modify it under the terms of
* the GNU General Public License as published by the Free Software Foundation;
* either version 2 of the License, or (at your option) any later version. This
* program is distributed in the hope that it will be useful, but WITHOUT ANY
* WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR
* A PARTICULAR PURPOSE. See the GNU General Public License for more details.
*/
package com.quiltplayer.model.neo;
import java.util.ArrayList;
import java.util.Collection;
import java.util.Collections;
import java.util.List;
import org.neo4j.graphdb.Direction;
import org.neo4j.graphdb.Node;
import org.neo4j.graphdb.Relationship;
import org.neo4j.graphdb.ReturnableEvaluator;
import org.neo4j.graphdb.StopEvaluator;
import org.neo4j.graphdb.Transaction;
import org.neo4j.graphdb.Traverser;
import com.quiltplayer.core.comparators.AlbumImageComparator;
import com.quiltplayer.core.comparators.YearComparator;
import com.quiltplayer.core.storage.neo.QuiltPlayerRelationshipTypes;
import com.quiltplayer.model.Album;
import com.quiltplayer.model.Artist;
import com.quiltplayer.model.ArtistName;
import com.quiltplayer.model.StringId;
import com.quiltplayer.properties.Config;
/**
* Neo implementation for Artist.
*
* @author Vlado Palczynski
*/
public class NeoArtist extends NeoTx implements Artist, Comparable<Artist> {
private static final String PROPERTY_ID = "albumId";
private static final String PROPERTY_NAME = "name";
public static final String PROPERTY_SPOTIFY_ID = "spotifyId";
private Node node;
private YearComparator yearComparator = new YearComparator();
private AlbumImageComparator albumImageComparator = new AlbumImageComparator();
public NeoArtist(final Node node) {
this.node = node;
}
/*
* @see com.quiltplayer.model.Artist#setId(com.quiltplayer.model.ArtistId)
*/
@Override
public void setId(final StringId id) {
Config.getNeoUtil().setProperty(node, PROPERTY_ID, id.getId());
}
/**
* Get the node.
*
* @return the node.
*/
public Node getNode() {
return node;
}
/*
* @see com.quiltplayer.model.ArtistInterface#getAlbums()
*/
@Override
public List<Album> getAlbums() {
List<Album> albums = null;
Transaction tx = null;
try {
tx = Config.getNeoDb().beginTx();
albums = new ArrayList<Album>();
for (Relationship rel : node.getRelationships(QuiltPlayerRelationshipTypes.HAS_ALBUM,
Direction.OUTGOING)) {
albums.add(new NeoAlbum(rel.getEndNode()));
}
tx.success();
}
finally {
tx.finish();
}
Collections.sort(albums, albumImageComparator);
Collections.sort(albums, yearComparator);
return albums;
}
/*
* @see com.quiltplayer.model.Artist#getId()
*/
@Override
public StringId getStringId() {
return new StringId((String) Config.getNeoUtil().getProperty(node, PROPERTY_ID));
}
/*
* @see com.quiltplayer.model.Artist#getArtistName()
*/
@Override
public ArtistName getArtistName() {
return new ArtistName((String) Config.getNeoUtil().getProperty(node, PROPERTY_NAME));
}
/*
* @see com.quiltplayer.model.ArtistInterface#addAlbum(com.quiltplayer.model. Album)
*/
@Override
public void addAlbum(final Album album) {
Transaction tx = beginTx();
node.createRelationshipTo(((NeoAlbum) album).getNode(),
QuiltPlayerRelationshipTypes.HAS_ALBUM);
finishTx(tx);
}
/*
* @see com.quiltplayer.model.ArtistInterface#removeAlbum(com.quiltplayer.model. Album)
*/
@Override
public void removeAlbum(final Album album) {
Transaction tx = beginTx();
Iterable<Relationship> relationships = node.getRelationships();
for (Relationship rel : relationships) {
if (rel.getEndNode().getId() == ((NeoAlbum) album).getNode().getId())
rel.delete();
}
finishTx(tx);
}
/*
* @see com.quiltplayer.model.Artist#setArtistName(com.quiltplayer.model.ArtistName )
*/
@Override
public void setArtistName(final ArtistName artistName) {
Config.getNeoUtil().setProperty(node, PROPERTY_NAME, artistName.getName());
}
/*
* @see com.quiltplayer.model.Artist#isThe()
*/
@Override
public boolean isThe() {
// TODO Auto-generated method stub
return false;
}
/*
* @see com.quiltplayer.model.Artist#setThe(boolean)
*/
@Override
public void setThe(final boolean the) {
// TODO Auto-generated method stub
}
/*
* (non-Javadoc)
*
* @see java.lang.Comparable#compareTo(java.lang.Object)
*/
@Override
public int compareTo(final Artist o) {
if (o == null) {
return 1;
}
return ((String) node.getProperty(PROPERTY_NAME)).compareTo(o.getArtistName().getName());
}
@Override
public boolean equals(final Object o) {
if (o instanceof NeoArtist) {
return this.node.equals(((NeoArtist) o).getNode());
}
return false;
}
@Override
public int hashCode() {
return this.node.hashCode();
}
public boolean hasAlbums() {
Transaction tx = beginTx();
Traverser nodes = node.traverse(Traverser.Order.DEPTH_FIRST, StopEvaluator.DEPTH_ONE,
ReturnableEvaluator.ALL_BUT_START_NODE, QuiltPlayerRelationshipTypes.HAS_ALBUM,
Direction.OUTGOING);
if (nodes.getAllNodes().size() == 0) {
finishTx(tx);
return false;
}
finishTx(tx);
return true;
}
/*
* (non-Javadoc)
*
* @see com.quiltplayer.model.Artist#hasAlbum(com.quiltplayer.model.Album)
*/
@Override
public boolean hasAlbum(Album album) {
Transaction tx = beginTx();
Traverser nodes = node.traverse(Traverser.Order.DEPTH_FIRST, StopEvaluator.DEPTH_ONE,
ReturnableEvaluator.ALL_BUT_START_NODE, QuiltPlayerRelationshipTypes.HAS_ALBUM,
Direction.OUTGOING);
Collection<Node> c = nodes.getAllNodes();
if (c.size() == 0) {
finishTx(tx);
return false;
}
else {
for (Node node : c) {
if (node.getProperty(NeoAlbum.PROPERTY_ID).equals(album.getId().getId())) {
finishTx(tx);
return true;
}
}
}
finishTx(tx);
return true;
}
/*
* (non-Javadoc)
*
* @see com.quiltplayer.model.Artist#getSpotifyId()
*/
@Override
public String getSpotifyId() {
String spotifyId = null;
Transaction tx = beginTx();
if (node.hasProperty(PROPERTY_SPOTIFY_ID)) {
spotifyId = (String) node.getProperty(PROPERTY_SPOTIFY_ID);
}
finishTx(tx);
return spotifyId;
}
/*
* (non-Javadoc)
*
* @see com.quiltplayer.model.Artist#setSpotifyId(java.lang.String)
*/
@Override
public void setSpotifyId(String spotifyId) {
if (spotifyId != null) {
Config.getNeoUtil().setProperty(node, PROPERTY_SPOTIFY_ID, spotifyId);
}
}
}