Implementation of university member, education member, and student.
- By Chung-Yeung Pang
- May 1, 2001
A Design Pattern for Type Extension With Facets and Decorators
by Chung-Yeung Pang
Listing 4. Implementation of university member, education member, and student.
package Accidental_Multi_Inheritance;
import Type_Extension.*;
import Persistent_Type_Decoration.*;
import java.sql.*;
import java.math.BigInteger;
import java.util.*;
public class UniversityMember extends ExtensibleObject implements PersistentObject {
String id = null;
String lastName;
String firstName;
BigInteger roles = BigInteger.valueOf(0);
PersistentDecorator pd = null;
int state = new_state;
public UniversityMember(String _id) {
state = new_state;
id = _id;
setName("University Member");
}
public void fetchData() throws Exception {
try {
if (pd == null) {
if (decorator != null)
pd = (PersistentDecorator) decorator.get("PersistentDecorator");
}
if (pd != null) {
Statement statement = pd.getConnection().createStatement();
ResultSet rSet = statement.executeQuery("select * from UNI_MEMBER where ID = '"+id+"'");
if (rSet != null) {
rSet.next();
lastName = rSet.getString("LASTNAME");
firstName = rSet.getString("FIRSTNAME");
roles = BigInteger.valueOf(rSet.getLong("ROLES"));
}
state = saved_state;
rSet.close();
statement.close();
}
} catch (Exception e) {
e.printStackTrace();
throw e;
}
}
public void state(int _state) {
state = _state;
}
public int state() {
return state;
}
public void save() throws Exception {
try {
if (pd == null) {
if (decorator != null)
pd= (PersistentDecorator)
decorator.get("PersistentDecorator");
}
if (pd != null) {
Statement statement = pd.getConnection().createStatement();
switch (state) {
case new_state:
statement.executeUpdate(
"insert into UNI_MEMBER (ID, FIRSTNAME, LASTNAME, ROLES) values ('"
+id+"','"+firstName+"','"+lastName+"',"+roles.longValue()+")");
statement.close();
state = saved_state;
break;
case edited_state:
statement.executeUpdate(
"update UNI_MEMBER set FIRSTNAME = '"+firstName+"', LASTNAME = '"
+lastName+"', ROLES = "+roles.longValue()+" where ID = '"+id+"'");
statement.close();
state = saved_state;
break;
default:
// nothing to save
break;
}
}
} catch (Exception e) {
e.printStackTrace();
throw e;
}
}
public void remove() throws Exception {
try {
if (pd == null) {
if (decorator != null)
pd = (PersistentDecorator)
decorator.get("PersistentDecorator");
}
if (pd != null) {
Statement statement = pd.getConnection().createStatement();
statement.executeUpdate(
"delete from UNI_MEMBER where ID = '"+id+"'");
firstName = null;
lastName = null;
roles = BigInteger.valueOf(0);
statement.close();
state = new_state;
}
} catch (Exception e) {
e.printStackTrace();
throw e;
}
}
public String getID() {
return id;
}
public void setID(String _id) {
id = _id;
}
public String getFirstName() {
return firstName;
}
public void setFirstName(String _firstName) {
firstName = _firstName;
}
public String getLastName() {
return lastName;
}
public void setLastName(String _lastName) {
lastName = _lastName;
}
BigInteger getRoles() {
return roles;
}
void setRoles(BigInteger _roles) {
roles = _roles;
}
}
public class EducationMember extends TypeDecorator implements PersistentObject {
String faculty = null;
int state = new_state;
String myID = null;
Vector newCourses;
Vector existingCourses;
Vector deletedCourses;
int role;
PersistentDecorator pd = null;
public EducationMember(int _role, UniversityMember u) {
role = _role;
newCourses = new Vector();
existingCourses = new Vector();
deletedCourses = new Vector();
}
public void fetchData() throws Exception {
try {
if (myID == null)
myID = ((UniversityMember) me).getID();
if (pd == null)
pd = (PersistentDecorator)
me.decorator.get("PersistentDecorator");
if (pd != null) {
Statement statement = pd.getConnection().createStatement();
ResultSet rSet = statement.executeQuery(
"select FACULTY from FACULTY_LINK where ID = '"+myID+"'");
if (rSet != null) {
rSet.next();
faculty = rSet.getString(1);
}
rSet.close();
rSet = statement.executeQuery(
"select COURSE from COURSE_LINK where ID = '"+myID+"' and ROLE = "
+role);
if (rSet != null) {
while (rSet.next()) {
String course = rSet.getString(1);
existingCourses.addElement(course);
}
}
state = saved_state;
rSet.close();
statement.close();
}
} catch (Exception e) {
e.printStackTrace();
throw e;
}
}
....
public void save() throws Exception {
try {
if (myID == null)
myID = ((UniversityMember) me).getID();
if (pd == null)
pd = (PersistentDecorator)
me.decorator.get("PersistentDecorator");
if ((pd != null) && (faculty != null)) {
Statement statement = pd.getConnection().createStatement();
switch (state) {
case new_state:
statement.executeUpdate(
"insert into FACULTY_LINK (FACULTY, ID, ROLE) values ('"
+faculty+"','"+myID+"',"+role+")");
for (Enumeration e = newCourses.elements() ;
e.hasMoreElements() ;) {
statement.executeUpdate(
"insert into COURSE_LINK (COURSE, ID, ROLE) values ('"
+(String) e.nextElement()+"','"+myID+"',"+role+")");
}
statement.close();
state = saved_state;
break;
case edited_state:
statement.executeUpdate(
"update FACULTY_LINK set FACULTY = '"
+faculty+"', ROLE = "+role+" where ID = '"+myID+"'");
for (Enumeration e = existingCourses.elements() ;
e.hasMoreElements() ;) {
statement.executeUpdate(
"update COURSE_LINK set COURSE = '" +(String) e.nextElement()+
"', ROLE = "+role+" where ID = '"+myID+"'");
}
for (Enumeration e = newCourses.elements() ;
e.hasMoreElements() ;) {
String str = (String) e.nextElement();
statement.executeUpdate(
"insert into COURSE_LINK (COURSE, ID, ROLE) values ('" +str+
"','"+myID+"',"+role+")");
existingCourses.addElement(str);
}
for (Enumeration e = deletedCourses.elements() ;
e.hasMoreElements() ;) {
statement.executeUpdate(
"delete from COURSE_LINK where ID = '"+myID+"'");
}
existingCourses.removeAllElements();
deletedCourses.removeAllElements();
statement.close();
state = saved_state;
break;
default:
// nothing to save
break;
}
}
} catch (Exception e) {
e.printStackTrace();
throw e;
}
}
public void remove() throws Exception {
try {
if (myID == null)
myID = ((UniversityMember) me).getID();
if (pd == null)
pd = (PersistentDecorator)
me.decorator.get("Persistent Decorator");
if (pd != null) {
Statement statement = pd.getConnection().createStatement();
statement.executeUpdate(
"delete from FACULTY_LINK where ID = '"+myID+"'");
statement.executeUpdate(
"delete from COURSE_LINK where ID = '"+myID+"'");
existingCourses.removeAllElements();
deletedCourses.removeAllElements();
statement.close();
state = new_state;
}
} catch (Exception e) {
e.printStackTrace();
throw e;
}
}
public String getFaculty() {
return faculty;
}
public void changeFaculty(String _faculty) {
faculty = _faculty;
state = edited_state;
}
public String[] getCourses() {
int count = 0;
count = existingCourses.size() + newCourses.size();
String[] courses = new String[count];
int i = 0;
for (Enumeration e = existingCourses.elements() ;
e.hasMoreElements() ;)
courses[i++] = (String) e.nextElement();
for (Enumeration e = newCourses.elements() ;
e.hasMoreElements() ;)
courses[i++] = (String) e.nextElement();
return courses;
}
public void addCourse(String course) {
newCourses.addElement(course);
state = edited_state;
}
public void removeCourse(String course) {
if (existingCourses.removeElement(course))
deletedCourses.addElement(course);
else
newCourses.removeElement(course);
state = edited_state;
}
}
public class Student extends EducationMember {
public Student(UniversityMember u) {
super(RoleFacet.student_role, u);
setName("Student");
decorate(u);
}
}