package de.tudarmstadt.gdi1.project.cipher.enigma;_x000D_
import java.util.List;_x000D_
_x000D_
import de.tudarmstadt.gdi1.project.cipher.enigma.Enigma;_x000D_
_x000D_
/**_x000D_
 * Implementiert das Enigma Interface._x000D_
 * @author Quoc Thong Huynh, Dennis Kuhn, Moritz Matthiesen, Erik Laurin Strelow_x000D_
 *_x000D_
 */_x000D_
public class EnigmaImpl implements Enigma {_x000D_
	/**_x000D_
	 * Liste von Rotoren_x000D_
	 */_x000D_
	List<Rotor> rotors;_x000D_
	_x000D_
	/**_x000D_
	 * Das Steckbrett_x000D_
	 */_x000D_
	PinBoard pinboard;_x000D_
	_x000D_
	/**_x000D_
	 * Umkehrrotor_x000D_
	 */_x000D_
	ReverseRotor reverseRotor;_x000D_
	_x000D_
	/**_x000D_
	 * Konstruktor der Enigma_x000D_
	 * @param rotors Liste der Rotoren_x000D_
	 * @param pinboard Das Steckbrett_x000D_
	 * @param reverseRotor Der Umkehrrotor_x000D_
	 */_x000D_
	public EnigmaImpl (List<Rotor> rotors, PinBoard pinboard, ReverseRotor reverseRotor){_x000D_
		this.rotors = rotors;_x000D_
		this.pinboard = pinboard;_x000D_
		this.reverseRotor = reverseRotor;_x000D_
		_x000D_
	}_x000D_
	_x000D_
	@Override_x000D_
	public String encrypt(String text){_x000D_
		char[] chars = text.toCharArray();_x000D_
		char[] transChars = new char[chars.length];_x000D_
		String result = "";_x000D_
		int i = 0;_x000D_
		//Einzelnen Buchstaben durch Pinboard und durch alle Rotoren_x000D_
		for(Character c: chars){_x000D_
			transChars[i] = pinboard.translate(c);_x000D_
			_x000D_
			//Buchstaben durch alle Rotoren pr��geln_x000D_
			for(int j = 0; j < rotors.size(); j++){				_x000D_
				transChars[i] = rotors.get(j).translate(transChars[i], true);				_x000D_
			}_x000D_
			_x000D_
			//Buchstaben durch reverseRotor werfen_x000D_
			transChars[i] = reverseRotor.translate(transChars[i]);_x000D_
			_x000D_
			//Buchstaben durch alle Rotoren in umgekehrter Reihenfolge werfen_x000D_
			for(int k = rotors.size()-1; k >= 0; k--){				_x000D_
				transChars[i] = rotors.get(k).translate(transChars[i], false);			_x000D_
			}_x000D_
			_x000D_
			transChars[i]=pinboard.translate(transChars[i]);_x000D_
			_x000D_
				/**for (int j = 1; rotors.get(j-1).rotate() ; j++){_x000D_
						rotors.get(j).rotate();					_x000D_
				}**/_x000D_
				_x000D_
			RotationAllRotors(0);_x000D_
			result += transChars[i];	_x000D_
			i++;_x000D_
			_x000D_
		}_x000D_
		for (int z = 0; z < rotors.size(); z++) rotors.get(z).reset();_x000D_
		_x000D_
		return result;_x000D_
	}_x000D_
	_x000D_
	/**_x000D_
	 * Hilfsprozedur RotationAllRotors: Rotiert stets den Rotor an der Stelle i, prueft ob rotate() true ausgibt (also eine komplette Umdrehung erfolgt ist) und ob es einen_x000D_
	 * 									weiteren Rotor gibt, wenn ja wird RotationAllRotors rekursiv fuer den naechsten Rotor aufgerufen _x000D_
	 * @param i Der zu rotierende Rotor_x000D_
	 */_x000D_
	public void RotationAllRotors(int i){_x000D_
	_x000D_
		if((rotors.get(i).rotate())&&(i+1<rotors.size()))_x000D_
			RotationAllRotors(i+1);_x000D_
	}_x000D_
	_x000D_
	_x000D_
	@Override_x000D_
	public String decrypt(String text){_x000D_
		char[] chars = text.toCharArray();_x000D_
		char[] transChars = new char[chars.length];_x000D_
		String result = "";_x000D_
		int i = 0;_x000D_
		//Einzelne Buchstaben durch Pinboard und durch alle Rotoren_x000D_
		for(Character c: chars){_x000D_
			transChars[i] = pinboard.translate(c);_x000D_
			_x000D_
			//Buchstaben durch alle Rotoren pruegeln_x000D_
			for(int j = 0; j < rotors.size(); j++){				_x000D_
				transChars[i] = rotors.get(j).translate(transChars[i], true);				_x000D_
			}_x000D_
			_x000D_
			//Buchstaben durch reverseRotor werfen_x000D_
			transChars[i] = reverseRotor.translate(transChars[i]);_x000D_
			_x000D_
			//Buchstaben durch alle Rotoren in umgekehrter Reihenfolge kloppen_x000D_
			for(int k = rotors.size()-1; k >= 0; k--){				_x000D_
				transChars[i] = rotors.get(k).translate(transChars[i], false);			_x000D_
			}_x000D_
			_x000D_
			transChars[i]=pinboard.translate(transChars[i]);_x000D_
			_x000D_
				/**for (int j = 1; rotors.get(j-1).rotate() ; j++){_x000D_
						rotors.get(j).rotate();					_x000D_
				}**/_x000D_
				_x000D_
			rotors.get(0).rotate();_x000D_
			result += transChars[i];	_x000D_
			i++;_x000D_
			_x000D_
		}_x000D_
		for (int z = 0; z < rotors.size(); z++) rotors.get(z).reset();_x000D_
		_x000D_
		return result;_x000D_
	}_x000D_
}_x000D_

/**for (int j = 1; rotors.get(j-1).rotate() ; j++){_x000D_
						rotors.get(j).rotate();					_x000D_
				}**/
package de.tudarmstadt.gdi1.project.cipher.enigma;_x000D_
import java.util.List;_x000D_
_x000D_
import de.tudarmstadt.gdi1.project.cipher.enigma.Enigma;_x000D_
_x000D_
/**_x000D_
 * Implementiert das Enigma Interface._x000D_
 * @author Quoc Thong Huynh, Dennis Kuhn, Moritz Matthiesen, Erik Laurin Strelow_x000D_
 *_x000D_
 */_x000D_
public class EnigmaImpl implements Enigma {_x000D_
	/**_x000D_
	 * Liste von Rotoren_x000D_
	 */_x000D_
	List<Rotor> rotors;_x000D_
	_x000D_
	/**_x000D_
	 * Das Steckbrett_x000D_
	 */_x000D_
	PinBoard pinboard;_x000D_
	_x000D_
	/**_x000D_
	 * Umkehrrotor_x000D_
	 */_x000D_
	ReverseRotor reverseRotor;_x000D_
	_x000D_
	/**_x000D_
	 * Konstruktor der Enigma_x000D_
	 * @param rotors Liste der Rotoren_x000D_
	 * @param pinboard Das Steckbrett_x000D_
	 * @param reverseRotor Der Umkehrrotor_x000D_
	 */_x000D_
	public EnigmaImpl (List<Rotor> rotors, PinBoard pinboard, ReverseRotor reverseRotor){_x000D_
		this.rotors = rotors;_x000D_
		this.pinboard = pinboard;_x000D_
		this.reverseRotor = reverseRotor;_x000D_
		_x000D_
	}_x000D_
	_x000D_
	@Override_x000D_
	public String encrypt(String text){_x000D_
		char[] chars = text.toCharArray();_x000D_
		char[] transChars = new char[chars.length];_x000D_
		String result = "";_x000D_
		int i = 0;_x000D_
		//Einzelnen Buchstaben durch Pinboard und durch alle Rotoren_x000D_
		for(Character c: chars){_x000D_
			transChars[i] = pinboard.translate(c);_x000D_
			_x000D_
			//Buchstaben durch alle Rotoren pr��geln_x000D_
			for(int j = 0; j < rotors.size(); j++){				_x000D_
				transChars[i] = rotors.get(j).translate(transChars[i], true);				_x000D_
			}_x000D_
			_x000D_
			//Buchstaben durch reverseRotor werfen_x000D_
			transChars[i] = reverseRotor.translate(transChars[i]);_x000D_
			_x000D_
			//Buchstaben durch alle Rotoren in umgekehrter Reihenfolge werfen_x000D_
			for(int k = rotors.size()-1; k >= 0; k--){				_x000D_
				transChars[i] = rotors.get(k).translate(transChars[i], false);			_x000D_
			}_x000D_
			_x000D_
			transChars[i]=pinboard.translate(transChars[i]);_x000D_
			_x000D_
				/**for (int j = 1; rotors.get(j-1).rotate() ; j++){_x000D_
						rotors.get(j).rotate();					_x000D_
				}**/_x000D_
				_x000D_
			RotationAllRotors(0);_x000D_
			result += transChars[i];	_x000D_
			i++;_x000D_
			_x000D_
		}_x000D_
		for (int z = 0; z < rotors.size(); z++) rotors.get(z).reset();_x000D_
		_x000D_
		return result;_x000D_
	}_x000D_
	_x000D_
	/**_x000D_
	 * Hilfsprozedur RotationAllRotors: Rotiert stets den Rotor an der Stelle i, prueft ob rotate() true ausgibt (also eine komplette Umdrehung erfolgt ist) und ob es einen_x000D_
	 * 									weiteren Rotor gibt, wenn ja wird RotationAllRotors rekursiv fuer den naechsten Rotor aufgerufen _x000D_
	 * @param i Der zu rotierende Rotor_x000D_
	 */_x000D_
	public void RotationAllRotors(int i){_x000D_
	_x000D_
		if((rotors.get(i).rotate())&&(i+1<rotors.size()))_x000D_
			RotationAllRotors(i+1);_x000D_
	}_x000D_
	_x000D_
	_x000D_
	@Override_x000D_
	public String decrypt(String text){_x000D_
		char[] chars = text.toCharArray();_x000D_
		char[] transChars = new char[chars.length];_x000D_
		String result = "";_x000D_
		int i = 0;_x000D_
		//Einzelne Buchstaben durch Pinboard und durch alle Rotoren_x000D_
		for(Character c: chars){_x000D_
			transChars[i] = pinboard.translate(c);_x000D_
			_x000D_
			//Buchstaben durch alle Rotoren pruegeln_x000D_
			for(int j = 0; j < rotors.size(); j++){				_x000D_
				transChars[i] = rotors.get(j).translate(transChars[i], true);				_x000D_
			}_x000D_
			_x000D_
			//Buchstaben durch reverseRotor werfen_x000D_
			transChars[i] = reverseRotor.translate(transChars[i]);_x000D_
			_x000D_
			//Buchstaben durch alle Rotoren in umgekehrter Reihenfolge kloppen_x000D_
			for(int k = rotors.size()-1; k >= 0; k--){				_x000D_
				transChars[i] = rotors.get(k).translate(transChars[i], false);			_x000D_
			}_x000D_
			_x000D_
			transChars[i]=pinboard.translate(transChars[i]);_x000D_
			_x000D_
				/**for (int j<SUF>*/_x000D_
				_x000D_
			rotors.get(0).rotate();_x000D_
			result += transChars[i];	_x000D_
			i++;_x000D_
			_x000D_
		}_x000D_
		for (int z = 0; z < rotors.size(); z++) rotors.get(z).reset();_x000D_
		_x000D_
		return result;_x000D_
	}_x000D_
}_x000D_
