/**
* $Id: EntityUser.java 130611 2013-10-18 14:17:53Z azeckoski@unicon.net $
* $URL: https://source.sakaiproject.org/svn/entitybroker/trunk/core-providers/src/java/org/sakaiproject/entitybroker/providers/model/EntityUser.java $
* EntityUser.java - entity-broker - Jun 28, 2008 5:24:57 PM - azeckoski
**************************************************************************
* Copyright (c) 2008, 2009 The Sakai Foundation
*
* Licensed under the Educational Community License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.opensource.org/licenses/ECL-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.sakaiproject.entitybroker.providers.model;
import java.util.Date;
import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;
import java.util.Stack;
import org.azeckoski.reflectutils.annotations.ReflectIgnoreClassFields;
import org.sakaiproject.entity.api.ResourceProperties;
import org.sakaiproject.entitybroker.entityprovider.annotations.EntityFieldRequired;
import org.sakaiproject.entitybroker.entityprovider.annotations.EntityId;
import org.sakaiproject.entitybroker.entityprovider.annotations.EntityLastModified;
import org.sakaiproject.entitybroker.entityprovider.annotations.EntityOwner;
import org.sakaiproject.entitybroker.entityprovider.annotations.EntityTitle;
import org.sakaiproject.time.api.Time;
import org.sakaiproject.user.api.User;
import org.w3c.dom.Document;
import org.w3c.dom.Element;
/**
* This class is needed to allow input and output since the User/UserEdit classes are too hard to work with,
* it is disappointing that this is needed, very disappointing indeed<br/>
* They seem to already be wrapped in a proxy as well for some reason based on the failure from xstream when
* it tries to work with them
*
* @author Aaron Zeckoski (azeckoski @ gmail.com)
*/
@SuppressWarnings("unchecked")
@ReflectIgnoreClassFields({"createdBy","modifiedBy","properties"})
public class EntityUser implements User {
@EntityId
private String id;
@EntityFieldRequired
private String eid;
private String password;
private String email;
private String firstName;
private String lastName;
private String displayName;
private String type;
private String owner;
private long lastModified;
public Map<String, String> props;
private transient User user;
public EntityUser() {}
/**
* Construct an EntityUser from a legacy user object
* @param user a legacy user or user edit
*/
public EntityUser(User user) {
this.user = user;
this.id = user.getId();
this.eid = user.getEid();
this.email = user.getEmail();
this.firstName = user.getFirstName();
this.lastName = user.getLastName();
this.displayName = user.getDisplayName();
this.owner = user.getCreatedBy() == null ? null : "/user/" + user.getCreatedBy().getId();
this.lastModified = user.getModifiedTime() == null ? System.currentTimeMillis() : user.getModifiedTime().getTime();
ResourceProperties rp = user.getProperties();
for (Iterator<String> iterator = rp.getPropertyNames(); iterator.hasNext();) {
String name = iterator.next();
String value = rp.getProperty(name);
this.setProperty(name, value);
}
}
public EntityUser(String eid, String email, String firstName, String lastName,
String displayName, String password, String type) {
this.eid = eid;
this.password = password;
this.email = email;
this.firstName = firstName;
this.lastName = lastName;
this.displayName = displayName;
this.type = type;
}
public void setProperty(String key, String value) {
if (props == null) {
props = new HashMap<String, String>();
}
props.put(key, value);
}
public String getProperty(String key) {
if (props == null) {
return null;
}
return props.get(key);
}
@EntityOwner
public String getOwner() {
return owner;
}
@EntityLastModified
public long getLastModified() {
return lastModified;
}
@EntityId
public String getId() {
return id;
}
public void setId(String id) {
this.id = id;
}
public String getEid() {
return eid;
}
public void setEid(String eid) {
this.eid = eid;
}
public String getEmail() {
return email;
}
public void setEmail(String email) {
this.email = email;
}
public String getFirstName() {
return firstName;
}
public void setFirstName(String firstName) {
this.firstName = firstName;
}
public String getLastName() {
return lastName;
}
public void setLastName(String lastName) {
this.lastName = lastName;
}
@EntityTitle
public String getDisplayName() {
return displayName;
}
public void setDisplayName(String displayName) {
this.displayName = displayName;
}
public String getType() {
return type;
}
public void setType(String type) {
this.type = type;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
public Map<String, String> getProps() {
if (props == null) {
props = new HashMap<String,String>();
}
return props;
}
public void setProps(Map<String, String> props) {
this.props = props;
}
// extra User junk below here
// TODO set these so they are ignored by reflection
public boolean checkPassword(String arg0) {
if (user != null) {
return user.checkPassword(arg0);
}
return false;
}
public User getCreatedBy() {
if (user != null) {
return user.getCreatedBy();
}
throw new UnsupportedOperationException();
}
public Time getCreatedTime() {
if (user != null) {
return user.getCreatedTime();
}
throw new UnsupportedOperationException();
}
public Date getCreatedDate() {
if (user != null) {
return user.getCreatedDate();
}
return new Date(lastModified);
}
public String getDisplayId() {
if (user != null) {
return user.getDisplayId();
}
return eid;
}
public User getModifiedBy() {
if (user != null) {
return user.getModifiedBy();
}
throw new UnsupportedOperationException();
}
public Time getModifiedTime() {
if (user != null) {
return user.getModifiedTime();
}
throw new UnsupportedOperationException();
}
public Date getModifiedDate() {
if (user != null) {
return user.getModifiedDate();
}
return new Date(lastModified);
}
public String getSortName() {
String sortName = null;
if (user != null) {
sortName = user.getSortName();
} else {
// generate the sortName
StringBuilder sb = new StringBuilder(128);
if (lastName != null) sb.append(lastName);
if (firstName != null) {
sb.append(", ");
sb.append(firstName);
}
if (sb.length() == 0) sb.append(email);
if (sb.length() == 0) sb.append(eid);
sortName = sb.toString();
}
return sortName;
}
public ResourceProperties getProperties() {
if (user != null) {
return user.getProperties();
}
throw new UnsupportedOperationException();
}
public String getReference() {
return "/user/" + id;
}
public String getReference(String arg0) {
return getReference();
}
public String getUrl() {
if (user != null) {
return user.getUrl();
}
throw new UnsupportedOperationException();
}
public String getUrl(String arg0) {
if (user != null) {
return user.getUrl(arg0);
}
throw new UnsupportedOperationException();
}
public Element toXml(Document arg0, Stack arg1) {
if (user != null) {
return user.toXml(arg0, arg1);
}
throw new UnsupportedOperationException();
}
public int compareTo(Object o) {
if (user != null) {
return user.compareTo(o);
}
throw new UnsupportedOperationException();
}
}