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    }