/*
* Copyright (c) 2010, the Last.fm Java Project and Committers
* All rights reserved.
*
* Redistribution and use of this software in source and binary forms, with or without modification, are
* permitted provided that the following conditions are met:
*
* - Redistributions of source code must retain the above
* copyright notice, this list of conditions and the
* following disclaimer.
*
* - Redistributions in binary form must reproduce the above
* copyright notice, this list of conditions and the
* following disclaimer in the documentation and/or other
* materials provided with the distribution.
*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED
* WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A
* PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR
* ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
* LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
* INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR
* TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
* ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*/
package de.umass.lastfm;
import java.text.DateFormat;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Collection;
import java.util.Date;
import java.util.List;
import java.util.Locale;
import de.umass.xml.DomElement;
/**
* Bean for Events.
*
* @author Janni Kovacs
*/
public class Event extends ImageHolder {
static final ItemFactory<Event> FACTORY = new EventFactory();
private static final DateFormat DATE_FORMAT = new SimpleDateFormat("EEE, dd MMM yyyy HH:mm:ss", Locale.ENGLISH);
private int id;
private String title;
private Collection<String> artists;
private String headliner;
private Collection<TicketSupplier> tickets;
private Date startDate;
private Date endDate;
private String description;
private String url;
private String website;
private int attendance;
private int reviews;
private Venue venue;
private Event() {
}
public Collection<String> getArtists() {
return artists;
}
public int getAttendance() {
return attendance;
}
public String getDescription() {
return description;
}
public String getHeadliner() {
return headliner;
}
public int getId() {
return id;
}
public int getReviews() {
return reviews;
}
/**
* Returns the start date and time of this event. Note that the time might not be correct, but instead a random time, if not set to a
* proper value on last.fm (happens often).
*
* @return start date
*/
public Date getStartDate() {
return startDate;
}
/**
* Returns the event's end date, or <code>null</code> if not available. End dates are only supplied for events such as festivals, which
* last longer than one day.
*
* @return end date
*/
public Date getEndDate() {
return endDate;
}
public String getTitle() {
return title;
}
/**
* Returns the last.fm event url, i.e. http://www.last.fm/event/event-id
*
* @return last.fm url
*/
public String getUrl() {
return url;
}
/**
* Returns the event website url, if available.
*
* @return event website url
*/
public String getWebsite() {
return website;
}
public Collection<TicketSupplier> getTicketSuppliers() {
return tickets;
}
public Venue getVenue() {
return venue;
}
/**
* Get the metadata for an event on Last.fm. Includes attendance and lineup information.
*
* @param eventId The numeric last.fm event id
* @param apiKey A Last.fm API key.
* @return Event metadata
*/
public static Event getInfo(String eventId, String apiKey) {
Result result = Caller.getInstance().call("event.getInfo", apiKey, "event", eventId);
return ResponseBuilder.buildItem(result, Event.class);
}
/**
* Set a user's attendance status for an event.
*
* @param eventId The numeric last.fm event id
* @param status The attendance status
* @param session A Session instance
* @return the Result of the operation.
* @see de.umass.lastfm.Event.AttendanceStatus
* @see de.umass.lastfm.Authenticator
*/
public static Result attend(String eventId, AttendanceStatus status, Session session) {
return Caller.getInstance().call("event.attend", session, "event", eventId, "status", String.valueOf(status.getId()));
}
/**
* Share an event with one or more Last.fm users or other friends.
*
* @param eventId An event ID
* @param recipients A comma delimited list of email addresses or Last.fm usernames. Maximum is 10.
* @param message An optional message to send with the recommendation.
* @param session A Session instance
* @return the Result of the operation
*/
public static Result share(String eventId, String recipients, String message, Session session) {
return Caller.getInstance().call("event.share", session, "event", eventId, "recipient", recipients, "message", message);
}
/**
* Get a list of attendees for an event.
*
* @param eventId The numeric last.fm event id
* @param apiKey A Last.fm API key
* @return a list of users who attended the given event
*/
public static Collection<User> getAttendees(String eventId, String apiKey) {
Result result = Caller.getInstance().call("event.getAttendees", apiKey, "event", eventId);
return ResponseBuilder.buildCollection(result, User.class);
}
/**
* Enumeration for the attendance status parameter of the <code>attend</code> operation.
*/
public static enum AttendanceStatus {
ATTENDING(0),
MAYBE_ATTENDING(1),
NOT_ATTENDING(2);
private int id;
private AttendanceStatus(int id) {
this.id = id;
}
public int getId() {
return id;
}
}
public static class TicketSupplier {
private String name;
private String website;
public TicketSupplier(String name, String website) {
this.name = name;
this.website = website;
}
public String getName() {
return name;
}
public String getWebsite() {
return website;
}
}
private static class EventFactory implements ItemFactory<Event> {
public Event createItemFromElement(DomElement element) {
// if (element == null)
// return null;
Event event = new Event();
ImageHolder.loadImages(event, element);
event.id = Integer.parseInt(element.getChildText("id"));
event.title = element.getChildText("title");
event.description = element.getChildText("description");
event.url = element.getChildText("url");
if (element.hasChild("attendance"))
event.attendance = Integer.parseInt(element.getChildText("attendance"));
if (element.hasChild("reviews"))
event.reviews = Integer.parseInt(element.getChildText("reviews"));
try {
event.startDate = DATE_FORMAT.parse(element.getChildText("startDate"));
if (element.hasChild("endDate")) {
event.endDate = DATE_FORMAT.parse(element.getChildText("endDate"));
}
} catch (ParseException e1) {
// Date format not valid !?, should definitely not happen. TODO: keep printStackTrace() ?
if (Caller.getInstance().isDebugMode())
e1.printStackTrace();
}
event.headliner = element.getChild("artists").getChildText("headliner");
event.artists = new ArrayList<String>();
for (DomElement artist : element.getChild("artists").getChildren("artist")) {
event.artists.add(artist.getText());
}
event.website = element.getChildText("website");
event.tickets = new ArrayList<TicketSupplier>();
if (element.hasChild("tickets")) {
for (DomElement ticket : element.getChild("tickets").getChildren("ticket")) {
event.tickets.add(new TicketSupplier(ticket.getAttribute("supplier"), ticket.getText()));
}
}
event.venue = ResponseBuilder.buildItem(element.getChild("venue"), Venue.class);
return event;
}
}
}