/**
 * Session Bean implementation class <%= model.getClassName() %>
 */
<%= model.getClassAnnotation() %>
<%
	Map<String, String> params = model.getClassAnnotationParams();
	if (!params.isEmpty()) { 
%>(
<%
		Set<String> keys = params.keySet();
		boolean needComma = false;
		for (String key : keys) {
			if (needComma) {
%>, 
<%
			}
			
			String value = params.get(key);
%><%= key %> = "<%= value %>"
<%
			needComma = true;
  		}
%>)
<%
	}

	if (!model.isContainerType()) {
%>
@TransactionManagement(TransactionManagementType.BEAN)
<%
	}

	List<BusinessInterface> localInterfaces = model.getExistingLocalBusinessInterfaces();
	if (!localInterfaces.isEmpty()) {
%>
@Local( { 
<%
		boolean needComma = false;
		for (BusinessInterface iface : localInterfaces) {
			if (needComma) {
%>, 
<%
			}
%><%= iface.getSimpleName() %>.class
<%
			needComma = true;
 		}
%> })
<%
	}

	List<BusinessInterface> remoteInterfaces = model.getExistingRemoteBusinessInterfaces();
	if (!remoteInterfaces.isEmpty()) {
%>
@Remote( { 
<%
		boolean needComma = false;
		for (BusinessInterface iface : remoteInterfaces) {
			if (needComma) {
%>, 
<%
			}
%><%= iface.getSimpleName() %>.class
<%
			needComma = true;
		}
%> })
<%
	}
	
	if (model.isNoInterfaceChecked()) {
%>
@LocalBean
<%
	}
		
	if (model.isLocalHomeChecked()) {
%>
@LocalHome(<%=model.getLocalHomeClassSimpleName()%>.class)
<%
	}

	if (model.isRemoteHomeChecked()) {
%>
@RemoteHome(<%=model.getRemoteHomeClassSimpleName()%>.class)
<%
	}
%>