package org.japanosample;
import java.io.IOException;
import java.io.InvalidObjectException;
import java.io.ObjectStreamException;
import java.io.Serializable;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collections;
import java.util.Comparator;
import java.util.Iterator;
import java.util.List;
import org.japano.Session;
import org.japano.action.Validator;
import org.japano.util.Util;
import org.japano.metadata.annotation.*;
@JapanoBean
public class User implements Serializable
{
public final static int RESET_INTERVAL=60*60*1000;
private static final long serialVersionUID = 0xc04d8ae0f7f10546L;
private final static int FEMALE=1;
private final static int MALE=2;
public static List USERS;
static
{
reset();
}
private static Comparator cmp=new Comparator()
{
public int compare(Object a, Object b)
{
return ((String)a).compareToIgnoreCase( (String)b);
}
};
private static List operatingSystems=new ArrayList(Arrays.asList(new String[]
{
"Linux",
"Os-X",
"Windows"
} ));
private static int nextId;
private int id=nextId();
private String alias, eMail, password, operatingSystem, bio="";
private boolean secretEmail=true;
public User()
{
}
private synchronized static int nextId()
{
return ++nextId;
}
public synchronized int getId()
{
return id;
}
public synchronized String getAlias()
{
return this.alias;
}
@JapanoText ( maxLength=50 )
public synchronized void setAlias(String alias)
{
this.alias=alias;
}
public synchronized String getEMail()
{
return this.eMail;
}
@JapanoValidation ( regex="[A-Za-z\\.0-9-]+@[A-Za-z\\.0-9-]+", errorMessage="Invalid email address" )
@JapanoText ( maxLength=256 )
public synchronized void setEMail(String eMail)
{
this.eMail = eMail;
}
public synchronized String getPasswordHash()
{
return this.password;
}
public synchronized void setPassword(String password)
{
this.password = Util.getSHADigest( password);
}
@JapanoTextArea ( maxLength=1024 )
public synchronized void setBio(String bio)
{
this.bio=bio;
}
public synchronized String getBio()
{
return bio;
}
@JapanoSelect ( options= {
@JapanoOption( text="Email secret", value="true"),
@JapanoOption( text="Email public", value="false")
} )
public synchronized void setSecretEmail(boolean secretEmail)
{
this.secretEmail=secretEmail;
}
public synchronized boolean isSecretEmail()
{
return secretEmail;
}
@JapanoSelect ( texts="getAllOperatingSystems" )
public synchronized void setOperatingSystem(String operatingSystem)
{
this.operatingSystem=operatingSystem;
}
public synchronized String getOperatingSystem()
{
return operatingSystem;
}
private int gender;
@JapanoRadio ( options= {
@JapanoOption ( name="female", value="1" ),
@JapanoOption ( name="male", value="2" )
} )
public synchronized void setGender(int gender)
{
this.gender=gender;
}
public synchronized int getGender()
{
return gender;
}
public static User fromId(int id)
{
for (Iterator i=USERS.iterator(); i.hasNext(); )
{
User u=(User)i.next();
if (u.getId() == id)
return u;
}
return null;
}
public static void addOperatingSystem(String system)
{
synchronized (operatingSystems)
{
if (!operatingSystems.contains(system))
operatingSystems.add(system);
Collections.sort( operatingSystems, cmp);
}
}
public static List getAllOperatingSystems()
{
synchronized (operatingSystems)
{
return new ArrayList( operatingSystems);
}
}
@JapanoFunction ( library="/user" )
public static String safeEMail(SampleSession session, User user)
{
if (user == null)
return null;
synchronized (user)
{
if (user.isSecretEmail())
{
if (!user.equals( session.getUser()))
return "(EMail secret)";
}
return user.getEMail();
}
}
private Object readResolve() throws ObjectStreamException
{
for (Iterator i=USERS.iterator(); i.hasNext(); )
{
User u=(User)i.next();
if (u.getId() == id)
return u;
}
throw new InvalidObjectException("invalid user id");
}
private static long lastReset;
public synchronized static void reset()
{
List l=new ArrayList();
User u=new User();
u.alias="wonko";
u.setEMail("user@example.com");
u.setPassword("password");
u.setGender(MALE);
l.add(u);
u=new User();
u.alias="3jane";
u.setEMail("user@example.net");
u.setPassword("password");
u.setGender(FEMALE);
l.add(u);
u=new User();
u.alias="frodo";
u.setEMail("user@example.org");
u.setPassword("password");
u.setGender(MALE);
l.add(u);
USERS=Collections.unmodifiableList(l);
lastReset=System.currentTimeMillis();
}
public synchronized static long getLastReset()
{
return lastReset;
}
}