
#ImplementsRemote
public class ImplementsRemote implements java.rmi.Remote
{
}

#NoDefaultConstructor
public class NoDefaultConstructor implements java.io.Serializable
{
	public NoDefaultConstructor(String param) {
	}
}

#NoDefaultConstructorPrivateConstructors
public class NoDefaultConstructorPrivateConstructors implements java.io.Serializable
{
	private NoDefaultConstructorPrivateConstructors(String param) {
	}
}

#HasInadmisableInnerClass
public class HasInadmisableInnerClass implements java.io.Serializable 
{
	public class InnerClass {	
	}
}

#UsesUnsupportedAsField
public class UsesUnsupportedAsField implements java.io.Serializable
{
	public java.util.logging.LogRecord field;
}

#UsesUnsupportedAsProperty
public class UsesUnsupportedAsProperty implements java.io.Serializable
{
	public UsesUnsupportedAsProperty() {
	}	
	
	public NoDefaultConstructor[] getRecord() {
		return null;
	}
}

#UsesUnsupportedInMethod
public class UsesUnsupportedInMethod
{
	public java.util.logging.LogRecord [][] otherMethod() {
		return null;
	}	
	
	public java.util.logging.LogRecord [][] validate() {
		return null;
	}
}

#UsesUnsupportedInTransientMethod
import javax.xml.bind.annotation.XmlTransient;
public class UsesUnsupportedInTransientMethod
{
	@XmlTransient
	public java.util.logging.LogRecord getLogRecord() {
		return null;
	}
}

#WebFaultClass
import javax.xml.ws.WebFault;
@WebFault
public class WebFaultClass
{
	public WebFaultClass(String a) {
	}
}

#XmlTypeClass
import javax.xml.bind.annotation.XmlType;
@XmlType
public class XmlTypeClass
{
	public XmlTypeClass(String a) {
	}
}

#BaseNotImplemented
public abstract class BaseNotImplemented
{
}

#BaseImplementedNotCorrectly
public abstract class BaseImplementedNotCorrectly
{
}

#BaseImplementedNotCorrectlyExtendor
public abstract class BaseImplementedNotCorrectlyExtendor
{
}

#BaseImplementedNotCorrectlyImplementor
public class BaseImplementedNotCorrectlyImplementor extends BaseImplementedNotCorrectlyExtendor
{
}

#BaseImplemented
public abstract class BaseImplemented
{
}

#BaseImplementedImplementor
public class BaseImplementedImplementor extends BaseImplemented implements java.io.Serializable
{
}

#InterfaceNotImplemented
public interface InterfaceNotImplemented
{
}

#InterfaceImplemented
public interface InterfaceImplemented
{
}

#InterfaceImplementedImplementor
public class InterfaceImplementedImplementor implements InterfaceImplemented, java.io.Serializable
{
}

#EnumType
public enum EnumType {
	StringType,
	IntType,
	FloatType
}

#MultyInheritanceUseClass
public class MultyInheritanceUseClass extends BaseImplemented implements InterfaceImplemented, java.io.Serializable
{
}

#MultyInheritanceUseInterfaces
public class MultyInheritanceUseInterfaces implements InterfaceImplemented, InterfaceNotImplemented
{
}

#SupportedMultyInheritanceWithBaseClass
public class SupportedMultyInheritanceWithBaseClass extends BaseImplemented implements java.io.Serializable, java.lang.Cloneable, java.lang.Comparable {
	public int compareTo(Object arg0) {
		return 0;
	}
}

#SupportedMultyInheritanceWithInterface
public class SupportedMultyInheritanceWithInterface implements InterfaceImplemented, java.io.Serializable, Cloneable, Comparable {
	public int compareTo(Object arg0) {
		return 0;
	}
}

#ContainsList
public class ContainsList implements java.io.Serializable {
	public java.util.Map<String, java.util.List<String>> param;
}

#ContainsNotSupportedInList
public class ContainsNotSupportedInList implements java.io.Serializable {
	public java.util.List<java.util.logging.LogRecord> param;
}

#ContainsQuoteInList
public class ContainsQuoteInList implements java.io.Serializable {
	public java.util.List<?> param;
}

#ContainsExtendsInList
public class ContainsExtendsInList implements java.io.Serializable {
	public java.util.List<? extends String> param;
}

#ContainsSuperInList
public class ContainsSuperInList implements java.io.Serializable {
	public java.util.List<? super  String> param;
}

#CircularAsParamA
public class CircularAsParamA implements java.io.Serializable 
{
	public CircularAsParamB cB;
}

#CircularAsParamB
public class CircularAsParamB implements java.io.Serializable 
{
	public CircularAsParamA cA;
}

#CircularAsReturnValueA
public class CircularAsReturnValueA implements java.io.Serializable 
{
	public CircularAsReturnValueB returnCB() {
		return null;
	}
}

#CircularAsReturnValueB
public class CircularAsReturnValueB implements java.io.Serializable 
{
	public CircularAsReturnValueA returnCA() {
		return null;
	}
}

#CircularAsMixedParamReturnValueA
public class CircularAsMixedParamReturnValueA implements java.io.Serializable 
{
	public CircularAsMixedParamReturnValueB cB;
}

#CircularAsMixedParamReturnValueB
public class CircularAsMixedParamReturnValueB implements java.io.Serializable 
{
	public CircularAsMixedParamReturnValueA returnCA() {
		return null;
	}
	
	public void useCa(CircularAsMixedParamReturnValueA cA) {
	}	
}

#CustomException
public class CustomException extends java.lang.Exception implements InterfaceImplemented
{
	public CustomException() 
	{
		super();
	}
}

#MySet
import java.util.Collection;
import java.util.Iterator;
import java.util.Set;

public class MySet<T> implements Set<T> 
{
	public boolean add(T o) { return false; }
	public boolean addAll(Collection<? extends T> c) { return false; }
	public void clear() {}
	public boolean contains(Object o) {	return false; }
	public boolean containsAll(Collection<?> c) { return false; }
	public boolean isEmpty() { return false; }
	public Iterator<T> iterator() { return null; }
	public boolean remove(Object o) { return false;}
	public boolean removeAll(Collection<?> c) { return false; }
	public boolean retainAll(Collection<?> c) { return false; }
	public int size() {	return 0; }
	public Object[] toArray() {	return null; }
	public <T> T[] toArray(T[] a) {	return null;}
}

#MyMap
import java.util.Collection;
import java.util.Map;
import java.util.Set;

public class MyMap<K, V> implements Map<K, V>
{
	public void clear() {}
	public boolean containsKey(Object key) { return false; }
	public boolean containsValue(Object value) { return false; }
	public Set<java.util.Map.Entry<K, V>> entrySet() { return null;	}
	public V get(Object key) { return null; }
	public boolean isEmpty() { return false; }
	public Set<K> keySet() { return null; }
	public V put(K key, V value) { return null; }
	public void putAll(Map<? extends K, ? extends V> t) {}
	public V remove(Object key) { return null; }
	public int size() {	return 0; }
	public Collection<V> values() { return null; }
}

#ParameterizedClass
public class ParameterizedClass<T> {
	public T value;
}

#ParameterizedMethodParameterEndpointClass
public class ParameterizedMethodParameterEndpointClass {
	public void test(ParameterizedClass<String> param) {
	}
}

#ParameterizedMethodReturnTypeEndpointClass
public class ParameterizedMethodReturnTypeEndpointClass {
	public ParameterizedClass<String> test() {
		return null;
	}
}
