@//////////////////////////////////////////////////////////////////////////////
@// su4sml --- a SML repository for managing (Secure)UML/OCL models
@//             http://projects.brucker.ch/su4sml/
@//                                                                            
@// C#_SecureUML.tpl --- template for C#
@// This file is part of su4sml.
@//
@// Copyright (c) 2005-2007, ETH Zurich, Switzerland
@//
@// All rights reserved.
@//
@// Redistribution and use in source and binary forms, with or without
@// modification, are permitted provided that the following conditions are
@// met:
@//
@//     * Redistributions of source code must retain the above copyright
@//       notice, this list of conditions and the following disclaimer.
@//
@//     * Redistributions in binary form must reproduce the above
@//       copyright notice, this list of conditions and the following
@//       disclaimer in the documentation and/or other materials provided
@//       with the distribution.
@//
@//     * Neither the name of the copyright holders nor the names of its
@//       contributors may be used to endorse or promote products derived
@//       from this software without specific prior written permission.
@//
@// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
@// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
@// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
@// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
@// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
@// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
@// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
@// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
@// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
@// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
@// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
@///////////////////////////////////////////////////////////////////////////////
@// $Id$


@// write permissions into XML-file

@openfile generated/csharp_secure/$classifier_package$.xml
<?xml version="1.0" encoding="utf-8" ?> 
@nl<!-- XML-permissions file for MdsEngine. Generated by su4sml-gcg. -->
@nl<!-- source: C#_SecureUML.tpl -->
@nl@nl<mds>

@foreach permission_list
@nl @tab <permission name="$permission_name$">
	@foreach role_list
	@nl @tab@tab <role name="$role_name$" />
	@end
	@foreach constraint_list
	@nl @tab@tab <condition lang="OCL">$constraint$</condition>
	@end
@nl @tab@tab <obligation></obligation>
@nl @tab </permission>
@end
@nl </mds>	

@// write C#-code

@openfile generated/csharp_secure/$classifier_package$.cs
// generated by su4sml GCG - Generic Code Generator  
@nl
@nl using System;
@nl using Mds;
@nl
@nl namespace $classifier_package$ 
@nl {

@foreach classifier_list
	
	@nl@nl@nl
	@if isPrimitive
	@nl @tab // no support for primitive $classifier_name$ !!
	@nl
	@elsif isEnumeration
	@nl @tab // no support for enumeration $classifier_name$ !!
	@nl
	@else
		@if isClass
		@nl @tab class $classifier_name$ 
		@elsif isInterface
		@nl @tab interface $classifier_name$
		@end
		@if hasParent
			: $classifier_parent$ 
		@end
		@nl @tab { 

		@foreach attribute_list

			@nl
			@if attribute_isPublic @// PROPERTY!

				@nl @tab@tab private $attribute_scope$ $attribute_type$ $attribute_name_small_letter$ ;
				@nl @tab@tab public $attribute_scope$ $attribute_type$ $attribute_name_capital$
				@nl @tab@tab {
				@nl @tab@tab@tab get 
				@nl @tab@tab@tab { 
				@foreach readPermission_list
				    @if first_permission	
					@nl @tab@tab@tab@tab 
					MdsEngine.Assert(this, new string[] {
				    @end
				    @if last_permission
					"$permission_name$" });
				    @else
					"$permission_name$",
				    @end
				@end
				@nl @tab@tab@tab@tab  return  $attribute_name_small_letter$;
				@nl @tab@tab@tab }
				@nl @tab@tab@tab set 
				@nl @tab@tab@tab {
				@foreach updatePermission_list
				    @if first_permission	
					@nl @tab@tab@tab@tab 
					MdsEngine.Assert(this, new string[] {
				    @end
				    @if last_permission
					"$permission_name$" });
				    @else
					"$permission_name$",
				    @end
				@end
				@nl @tab@tab@tab@tab $attribute_name_small_letter$ = value ; 
				@nl @tab@tab@tab }
				@nl @tab@tab }
			@else
				@nl @tab@tab $attribute_visibility$ $attribute_scope$ $attribute_type$ $attribute_name$ ;
			@end

		@end
		@nl
		@foreach operation_list
		@nl @tab@tab  public $operation_scope$ $operation_result_type$ $operation_name$(
			@foreach argument_list
				@if last_argument 
					$argument_type$ $argument_name$
				@else 
					$argument_type$ $argument_name$ ,
				@end
			@end
			     )
		@nl @tab@tab {

		@foreach executePermission_list
			    @if first_permission	
				@nl@tab@tab@tab  
				MdsEngine.Assert(this, new string[] {
			    @end
			    @if last_permission
				"$permission_name$" });
			    @else
				"$permission_name$",
			    @end
		@end
		@nl @tab@tab@tab // ...toDo...
		@nl @tab@tab } 
		@end
		@nl
		@// Constructor:
		@nl @tab@tab //  Constructor
		@nl @tab@tab $classifier_name$() 
		@nl @tab@tab {
		@foreach createPermission_list
		    @if first_permission	
			@nl @tab @tab @tab
			MdsEngine.Assert(this, new string[] {
		    @end
		    @if last_permission
			"$permission_name$" });
		    @else
			"$permission_name$",
		    @end
		@end
		@nl @tab@tab }
		@nl
		@// Destructor:
		@nl @tab@tab // Destructor
		@nl @tab@tab ~$classifier_name$() 
		@nl @tab@tab {
		@foreach deletePermission_list
		    @if first_permission	
			@nl @tab @tab @tab
			MdsEngine.Assert(this, new string[] {
		    @end
		    @if last_permission
			"$permission_name$" });
		    @else
			"$permission_name$",
		    @end
		@end
		@nl @tab@tab }

		@nl @tab }
	@end
@end
@nl} @// End
