#SEIIsClass
public class SEIIsClass
{
	public SEIIsClass(String a) {
	}
	
	public interface InternalSei {
	}
}

#SEINotPublic
interface SEINotPublic
{
}

#SEIIncorrectMethods
public interface SEIIncorrectMethods
{
	public SEIIsClass method1();
}

#SEIExtendsSeiWithIncorrectMethods
public interface SEIExtendsSeiWithIncorrectMethods extends SEIIncorrectMethods
{
	public String method2();
}


#INotImplemented
import java.util.List;
import java.util.Map;
public interface INotImplemented
{
	public List<String> method(String param) throws Exception;
}

#NotImplementedMethodParamsBean
import java.util.List;
import java.util.Map;
public class NotImplementedMethodParamsBean
{
	public String method(String a) {}
	
	public List<String> method(int a) {}

	public List<String> method(String param, int a) {}
	
	public void method1(Map<String, List> p) {}
}

#NotImplementedMethodExceptionsBean
import java.util.List;
import java.util.Map;
public class NotImplementedMethodExceptionsBean
{
	public List<String> method(String param) throws java.io.IOException {
		return null;
	}
}

#IImplemented
import java.util.List;
import java.util.Map;
public interface IImplemented
{
	public List<String> method(String param);
	
	public void method1(Map<String, List> p);
}

#ImplementedBeanBase
import java.util.List;
public class ImplementedBeanBase {
	public List<String> method(String param) { return null; }
}

#BeanImplementsSei
import java.util.List;
import java.util.Map;
public class BeanImplementsSei extends ImplementedBeanBase implements IImplemented {
	public void method1(Map<String, List> p) {}
}

#ImplementedBean
import java.util.List;
import java.util.Map;
public class ImplementedBean extends ImplementedBeanBase {
	public void method1(Map<String, List> p) {}
}


#IImplementedExtended
import java.util.List;
import java.util.Map;
public interface IImplementedExtended extends IImplemented
{
	public int [] method2(String p1, float p2);
	
	public String [][] method3(double p1);
}

#ImplementedExtendedBean
import java.util.List;
import java.util.Map;
public class ImplementedExtendedBean
{
	public List<String> method(String param) { return null; }
	
	public void method1(Map<String, List> p) {}
	
	public int [] method2(String p1, float p2) { return null; }
	
	public String [][] method3(double p1) { return null; }
}

#ImplementedBean1
import java.util.List;
import java.util.Map;
// should implement IImplemented
public class ImplementedBean1 {
	public List<String> method(String param) { return null; }
	
	protected void method1(Map<String, List> p) {}
}

#MyException
public class MyException extends Exception {
}

#IExceptionsUsed
public interface IExceptionsUsed {
	public void method() throws MyException;	
	public void method1() throws java.lang.Exception;
}

#ExceptionsUsedBean
public class ExceptionsUsedBean {
	public void method() {}
	public void method1() throws Exception {}	
}

#ExceptionsUsedBean1
public class ExceptionsUsedBean1 {
	public void method() throws org.eclipse.tests.MyException {}
	public void method1() throws Exception {}	
}
