import java.math.BigInteger;

/*******************************************************************************
 * Copyright (c) 2010 Jesper Steen Moller and others.
 * All rights reserved. This program and the accompanying materials
 * are made available under the terms of the Eclipse Public License v1.0
 * which accompanies this distribution, and is available at
 * http://www.eclipse.org/legal/epl-v10.html
 * 
 * Contributors:
 *     Jesper Steen Moller - Enhancement 254677 - filter getters/setters
 *******************************************************************************/

public class StepFilterFour {

	public StepFilterFour() {
	}

	byte b;
	int i;
	short s;
	long l;
	double d;
	float f;
	Object o;

	public byte getB() {
		return b;
	}
	public void setB(byte b) {
		this.b = b;
	}
	public int getI() {
		return i;
	}
	public void setI(int i) {
		this.i = i;
	}
	public short getS() {
		return s;
	}
	public void setS(short s) {
		this.s = s;
	}
	public long getL() {
		return l;
	}
	public void setL(long l) {
		this.l = l;
	}
	public double getD() {
		return d;
	}
	public void setD(double d) {
		this.d = d;
	}
	public float getF() {
		return f;
	}
	public void setF(float f) {
		this.f = f;
	}
	public Object getO() {
		return o;
	}
	public void setO(Object o) {
		this.o = o;
	}

	private double sum() {
		return b + i + s + l + d + f;
	}

	public static void main(String[] args) {
		StepFilterFour sf1 = new StepFilterFour();
		sf1.go();
	}

	void go() {
		Object o2 = new Object();
		
		// All these statements should single step nicely with the
		// getter and setter filter turned on.
		this.setI(22);
		this.setL(32);
		this.setD(123.0);
		this.setF(32.0F);
		this.setO(o2);

		// these, too
		boolean isBig = this.getI() > 20;
		isBig &= this.getL() < 20;
		isBig &= this.getD() % 5.0 == 4;
		isBig &= this.getF() % 3.0F == 4.0F;
		isBig &= this.getO() instanceof BigInteger;
		if (this.getI() == 22 && this.sum() > 50) { // single stepping into this should land us in sum()
			this.doNothing("fun " + (isBig ? " and big" : " and medium"));
		}
		
		this.doNothing("f was = " + this.getF());
		// even this should fall right through
		this.setF(this.getF() + 1.0F);
		this.doNothing("f is = " + this.getF());
	}
	
	private void doNothing(String string) {	
	}

	// This added so w don't suddenly step into the classloader from Launcher
	private BigInteger triggerLoad = BigInteger.valueOf(42);
}
