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 }