001 package sysModel.fish;
002
003 import sysModel.ISecurityAdapter;
004
005 import java.awt.*;
006 import java.lang.reflect.Constructor;
007
008 /**
009 * AFish factory to dynamically create new fish.
010 *
011 * @author Mathias Ricken
012 */
013 public class DynamicFishFactory implements IFishFactory {
014 /// current name of the fish class
015 private String _curName;
016
017 /// current color of the fish
018 private Color _curColor;
019
020 /// security adapter
021 private ISecurityAdapter _securityAdapter;
022
023 /**
024 * Construct a new factory.
025 *
026 * @param name initial name
027 * @param color initial color
028 * @param sa security adapter
029 */
030 public DynamicFishFactory(String name, Color color, ISecurityAdapter sa) {
031 _curName = name;
032 _curColor = color;
033 _securityAdapter = sa;
034 }
035
036 /**
037 * Mutator for the name.
038 *
039 * @param newName new name
040 */
041 public void setName(String newName) {
042 _curName = newName;
043 }
044
045
046 /**
047 * Mutator for the color.
048 *
049 * @param newColor new color
050 */
051 public void setName(Color newColor) {
052 _curColor = newColor;
053 }
054
055 /**
056 * Create a new fish.
057 *
058 * @return new fish
059 */
060 public AFish createFish() {
061 try {
062 // NOTE: Introduced class loader here
063 // Class fishClass = Class.forName(_curName);
064 Class fishClass = _securityAdapter.getClassLoader().loadClass(_curName);
065 Constructor envCtor = fishClass.getConstructor(new Class[]{Color.class});
066 return (AFish) envCtor.newInstance(new Object[]{_curColor});
067 }
068 catch (Exception e) {
069 throw new RuntimeException("Error loading fish class", e);
070 }
071 }
072 }