/*
* Copyright 2011, Nabil Benothman, and individual contributors
* as indicated by the @author tags. See the copyright.txt file in the
* distribution for a full listing of individual contributors.
*
* This is free software; you can redistribute it and/or modify it
* under the terms of the GNU Lesser General Public License as
* published by the Free Software Foundation; either version 2.1 of
* the License, or (at your option) any later version.
*
* This software 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
* Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public
* License along with this software; if not, write to the Free
* Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
* 02110-1301 USA, or see the FSF site: http://www.fsf.org.
*/
package com.ubike.rest.converter;
import com.ubike.model.UbikeUser;
import java.net.URI;
import javax.xml.bind.annotation.XmlRootElement;
import javax.xml.bind.annotation.XmlElement;
import javax.xml.bind.annotation.XmlTransient;
import javax.xml.bind.annotation.XmlAttribute;
import javax.ws.rs.core.UriBuilder;
import javax.persistence.EntityManager;
import com.ubike.model.Account;
import com.ubike.model.MemberShip;
import com.ubike.model.PrivacyPreferences;
import com.ubike.model.Trip;
import java.util.List;
/**
* {@code UbikeUserConverter}
* <p/>
*
* Created on Jun 6, 2011 at 7:17:22 PM
*
* @author <a href="mailto:nabil.benothman@gmail.com">Nabil Benothman</a>
*/
@XmlRootElement(name = "ubike-user")
public class UbikeUserConverter {
private UbikeUser entity;
private URI uri;
private int expandLevel;
/**
* Creates a new instance of UbikeUserConverter
*/
public UbikeUserConverter() {
entity = new UbikeUser();
}
/**
* Creates a new instance of UbikeUserConverter.
*
* @param entity associated entity
* @param uri associated uri
* @param expandLevel indicates the number of levels the entity graph should be expanded@param isUriExtendable indicates whether the uri can be extended
*/
public UbikeUserConverter(UbikeUser entity, URI uri, int expandLevel,
boolean isUriExtendable) {
this.entity = entity;
this.uri = (isUriExtendable) ? UriBuilder.fromUri(uri).path(entity.getId() + "/").build() : uri;
this.expandLevel = expandLevel;
getTrips();
getAccount();
getMemberShips();
getPreferences();
}
/**
* Creates a new instance of UbikeUserConverter.
*
* @param entity associated entity
* @param uri associated uri
* @param expandLevel indicates the number of levels the entity graph should be expanded
*/
public UbikeUserConverter(UbikeUser entity, URI uri, int expandLevel) {
this(entity, uri, expandLevel, false);
}
/**
* Getter for id.
*
* @return value for id
*/
@XmlElement
public Long getId() {
return (expandLevel > 0) ? entity.getId() : null;
}
/**
* Setter for id.
*
* @param value the value to set
*/
public void setId(Long value) {
entity.setId(value);
}
/**
* Getter for firstName.
*
* @return value for firstName
*/
@XmlElement
public String getFirstname() {
return (expandLevel > 0) ? entity.getFirstname() : null;
}
/**
* Setter for firstName.
*
* @param value the value to set
*/
public void setFirstname(String value) {
entity.setFirstname(value);
}
/**
* Getter for lastName.
*
* @return value for lastName
*/
@XmlElement
public String getLastname() {
return (expandLevel > 0) ? entity.getLastname() : null;
}
/**
* Setter for lastName.
*
* @param value the value to set
*/
public void setLastname(String value) {
entity.setLastname(value);
}
/**
* Getter for address.
*
* @return value for address
*/
@XmlElement
public String getAddress() {
return (expandLevel > 0) ? entity.getAddress() : null;
}
/**
* Setter for address.
*
* @param value the value to set
*/
public void setAddress(String value) {
entity.setAddress(value);
}
/**
* Getter for phone.
*
* @return value for phone
*/
@XmlElement
public String getPhone() {
return (expandLevel > 0) ? entity.getPhone() : null;
}
/**
* Setter for phone.
*
* @param value the value to set
*/
public void setPhone(String value) {
entity.setPhone(value);
}
/**
* Getter for email.
*
* @return value for email
*/
@XmlElement
public String getEmail() {
return (expandLevel > 0) ? entity.getEmail() : null;
}
/**
* Setter for email.
*
* @param value the value to set
*/
public void setEmail(String value) {
entity.setEmail(value);
}
/**
* Getter for trips.
*
* @return value for trips
*/
@XmlElement
public TripsConverter getTrips() {
if (expandLevel > 0) {
if (entity.getTrips() != null) {
return new TripsConverter(entity.getTrips(),
uri.resolve("trips/"), expandLevel - 1);
}
}
return null;
}
/**
* Setter for trips.
*
* @param value the value to set
*/
public void setTrips(TripsConverter value) {
entity.setTrips((value != null) ? value.getEntities() : null);
}
/**
* Getter for account.
*
* @return value for account
*/
@XmlElement
public AccountConverter getAccount() {
if (expandLevel > 0) {
if (entity.getAccount() != null) {
return new AccountConverter(entity.getAccount(),
uri.resolve("account/"), expandLevel - 1, false);
}
}
return null;
}
/**
* Setter for account.
*
* @param value the value to set
*/
public void setAccount(AccountConverter value) {
entity.setAccount((value != null) ? value.getEntity() : null);
}
/**
* Getter for memberShips.
*
* @return value for memberShips
*/
@XmlElement
public MemberShipsConverter getMemberShips() {
if (expandLevel > 0) {
if (entity.getMemberShips() != null) {
return new MemberShipsConverter(entity.getMemberShips(),
uri.resolve("memberShips/"), expandLevel - 1);
}
}
return null;
}
/**
* Setter for memberShips.
*
* @param value the value to set
*/
public void setMemberShips(MemberShipsConverter value) {
entity.setMemberShips((value != null) ? value.getEntities() : null);
}
/**
* Getter for preferences.
*
* @return value for preferences
*/
@XmlElement
public PrivacyPreferencesConverter getPreferences() {
if (expandLevel > 0) {
if (entity.getPreferences() != null) {
return new PrivacyPreferencesConverter(entity.getPreferences(),
uri.resolve("preferences/"), expandLevel - 1, false);
}
}
return null;
}
/**
* Setter for preferences.
*
* @param value the value to set
*/
public void setPreferences(PrivacyPreferencesConverter value) {
entity.setPreferences((value != null) ? value.getEntity() : null);
}
/**
* Returns the URI associated with this converter.
*
* @return the uri
*/
@XmlAttribute
public URI getUri() {
return uri;
}
/**
* Sets the URI for this reference converter.
*
*/
public void setUri(URI uri) {
this.uri = uri;
}
/**
* Returns the UbikeUser entity.
*
* @return an entity
*/
@XmlTransient
public UbikeUser getEntity() {
if (entity.getId() == null) {
UbikeUserConverter converter = UriResolver.getInstance().resolve(UbikeUserConverter.class,
uri);
if (converter != null) {
entity = converter.getEntity();
}
}
return entity;
}
/**
* Returns the resolved UbikeUser entity.
*
* @return an resolved entity
*/
public UbikeUser resolveEntity(EntityManager em) {
List<Trip> trips = entity.getTrips();
List<Trip> newtrips = new java.util.ArrayList<Trip>();
for (Trip item : trips) {
newtrips.add(em.getReference(Trip.class, item.getId()));
}
entity.setTrips(newtrips);
Account account = entity.getAccount();
if (account != null) {
entity.setAccount(em.getReference(Account.class, account.getId()));
}
List<MemberShip> memberShips = entity.getMemberShips();
List<MemberShip> newmemberShips = new java.util.ArrayList<MemberShip>();
for (MemberShip item : memberShips) {
newmemberShips.add(em.getReference(MemberShip.class, item.getId()));
}
entity.setMemberShips(newmemberShips);
PrivacyPreferences preferences = entity.getPreferences();
if (preferences != null) {
entity.setPreferences(em.getReference(PrivacyPreferences.class,
preferences.getId()));
}
return entity;
}
}