package it.csi.demo.democomp.presentation.democomp.action.miaapp;

import java.util.*;

import java.lang.reflect.InvocationTargetException;
import java.beans.IntrospectionException;

import org.apache.struts2.interceptor.validation.SkipValidation;

import com.opensymphony.xwork2.Preparable;
import com.opensymphony.xwork2.validator.annotations.*;
import com.opensymphony.xwork2.conversion.annotations.*;
import com.opensymphony.xwork2.ActionContext;

import it.csi.demo.democomp.dto.*;

import it.csi.demo.democomp.presentation.democomp.security.*;

import it.csi.demo.democomp.business.*;

import it.csi.demo.democomp.presentation.democomp.action.*;

import it.csi.demo.democomp.presentation.democomp.interceptor.MethodProtection;

import it.csi.demo.democomp.presentation.democomp.interceptor.FatClientOnly;
import it.csi.demo.democomp.presentation.uiutils.*;
import flexjson.JSON;

/**
 * CpDettaglioCittadinoAction Action Class.
 *
 * @author GuiGen
 */
@Validation()
@Conversion()
public class CpDettaglioCittadinoAction extends BaseAction
		implements
			Preparable {

	@VisitorFieldValidator(message = "", key = "cpDettaglioCittadino.cittadino.visitorvalidator.label", appendPrefix = true)
	public void setAppDatacittadino(
			it.csi.demo.democomp.dto.nspersona.Cittadino value) {
		getSession().put("appDatacittadino", value);
	}

	public it.csi.demo.democomp.dto.nspersona.Cittadino getAppDatacittadino() {
		return (it.csi.demo.democomp.dto.nspersona.Cittadino) (getSession()
				.get("appDatacittadino"));
	}

	@VisitorFieldValidator(message = "", key = "cpDettaglioCittadino.filtroPersona.visitorvalidator.label", appendPrefix = true)
	public void setAppDatafiltroPersona(
			it.csi.demo.democomp.dto.nspersona.Persona value) {
		getSession().put("appDatafiltroPersona", value);
	}

	public it.csi.demo.democomp.dto.nspersona.Persona getAppDatafiltroPersona() {
		return (it.csi.demo.democomp.dto.nspersona.Persona) (getSession()
				.get("appDatafiltroPersona"));
	}

	@VisitorFieldValidator(message = "", key = "cpDettaglioCittadino.persone.visitorvalidator.label", appendPrefix = true)
	public void setAppDatapersone(
			java.util.ArrayList<it.csi.demo.democomp.dto.nspersona.Persona> value) {
		getSession().put("appDatapersone", value);
	}

	public java.util.ArrayList<it.csi.demo.democomp.dto.nspersona.Persona> getAppDatapersone() {
		return (java.util.ArrayList<it.csi.demo.democomp.dto.nspersona.Persona>) (getSession()
				.get("appDatapersone"));
	}

	public void setAppDataprovince(
			java.util.ArrayList<it.csi.demo.democomp.dto.nspersona.Provincia> value) {
		getSession().put("appDataprovince", value);
	}

	public java.util.ArrayList<it.csi.demo.democomp.dto.nspersona.Provincia> getAppDataprovince() {
		return (java.util.ArrayList<it.csi.demo.democomp.dto.nspersona.Provincia>) (getSession()
				.get("appDataprovince"));
	}

	public void setAppDataregioni(
			java.util.ArrayList<it.csi.demo.democomp.dto.nspersona.Regione> value) {
		getSession().put("appDataregioni", value);
	}

	public java.util.ArrayList<it.csi.demo.democomp.dto.nspersona.Regione> getAppDataregioni() {
		return (java.util.ArrayList<it.csi.demo.democomp.dto.nspersona.Regione>) (getSession()
				.get("appDataregioni"));
	}

	public void setAppDatacomuni(
			java.util.ArrayList<it.csi.demo.democomp.dto.nspersona.Comune> value) {
		getSession().put("appDatacomuni", value);
	}

	public java.util.ArrayList<it.csi.demo.democomp.dto.nspersona.Comune> getAppDatacomuni() {
		return (java.util.ArrayList<it.csi.demo.democomp.dto.nspersona.Comune>) (getSession()
				.get("appDatacomuni"));
	}

	public void setAppDatacomuni2(
			java.util.ArrayList<it.csi.demo.democomp.dto.nspersona.Comune> value) {
		getSession().put("appDatacomuni2", value);
	}

	public java.util.ArrayList<it.csi.demo.democomp.dto.nspersona.Comune> getAppDatacomuni2() {
		return (java.util.ArrayList<it.csi.demo.democomp.dto.nspersona.Comune>) (getSession()
				.get("appDatacomuni2"));
	}

	public void setAppDataprovince2(
			java.util.ArrayList<it.csi.demo.democomp.dto.nspersona.Provincia> value) {
		getSession().put("appDataprovince2", value);
	}

	public java.util.ArrayList<it.csi.demo.democomp.dto.nspersona.Provincia> getAppDataprovince2() {
		return (java.util.ArrayList<it.csi.demo.democomp.dto.nspersona.Provincia>) (getSession()
				.get("appDataprovince2"));
	}

	public void setAppDataselettoreOperazione(java.lang.String value) {
		getSession().put("appDataselettoreOperazione", value);
	}

	public java.lang.String getAppDataselettoreOperazione() {
		return (java.lang.String) (getSession()
				.get("appDataselettoreOperazione"));
	}

	public void setAppDataselTabellaIdPersona(java.lang.Integer value) {
		getSession().put("appDataselTabellaIdPersona", value);
	}

	public java.lang.Integer getAppDataselTabellaIdPersona() {
		return (java.lang.Integer) (getSession()
				.get("appDataselTabellaIdPersona"));
	}

	/////////////////////////////////////////
	/// property comuni a tutte le action
	/////////////////////////////////////////

	/// parametri per cambio TAB

	private String selectedTabKey;

	public void setSelectedTabKey(String value) {
		selectedTabKey = value;
	}

	public String getSelectedTabKey() {
		return selectedTabKey;
	}

	private String selectedTabValue;

	public void setSelectedTabValue(String value) {
		selectedTabValue = value;
	}

	public String getSelectedTabValue() {
		return selectedTabValue;
	}

	/**
	 * @generated
	 */
	private List<TableFilter> filter;

	/**
	 * @generated
	 */
	public List<TableFilter> getFilter() {
		return filter;
	}

	/**
	 * @generated
	 */
	public void setFilter(List<TableFilter> filter) {
		this.filter = filter;
	}

	/**
	 * @generated
	 */
	private TableStatus tableStatus;

	/**
	 * @generated
	 */
	public TableStatus getTableStatus() {
		return tableStatus;
	}

	/**
	 * @generated
	 */
	public void setTableStatus(TableStatus tableStatus) {
		this.tableStatus = tableStatus;
	}

	/**
	 * classe model associata
	 */
	public Class modelClass() {
		return it.csi.demo.democomp.dto.miaapp.CpDettaglioCittadinoModel.class;
	}

	/**
	 * I singoli eventi sui singoli widget sono gestiti dai metodi specifici
	 * @return SUCCESS.
	 */
	@SkipValidation
	public String execute() throws CommandExecutionException {
		// esegue eventuali comandi di clear appdata
		ICommand clearCmd = (ICommand) session
				.get(PENDING_CLEAR_COMMAND_ATTRIBUTE);
		if (clearCmd != null) {
			clearCmd.doCommand(this);
			session.remove(PENDING_CLEAR_COMMAND_ATTRIBUTE);
		}
		return SUCCESS;
	}

	//////////////////////////////////////////////////////////////////////////////////
	/// metodi specifici per la gestione del singolo tipo di evento sul singolo widget
	/// contenuto nel contentPanel
	/// metodo: handle<nomeWidget>_<NOME_EVENTO>
	/// es: handletreeVoci_CLICKED
	//////////////////////////////////////////////////////////////////////////////////

	/**
	 * Gestione dell'evento VALUE_CHANGED sul widget [cbProvinciaNascita]
	 */
	@SkipValidation
	@MethodProtection(level = "REJECT_SAME")
	public String handleCbProvinciaNascita_VALUE_CHANGED()
			throws CommandExecutionException {
		ICommand action = initCommand("cbProvinciaNascita", "VALUE_CHANGED");
		if (log.isDebugEnabled()) {
			log.debug("[CpDettaglioCittadinoAction::handleCbProvinciaNascita_VALUE_CHANGED] dump model before");
			dumpModel(false);
		}

		String result = action.doCommand(this);
		if (result != null) {
			if (log.isDebugEnabled()) {
				log.debug("[CpDettaglioCittadinoAction::handleCbProvinciaNascita_VALUE_CHANGED] dump model after");
				dumpModel(false);
				log.debug("[CpDettaglioCittadinoAction::handleCbProvinciaNascita_VALUE_CHANGED] returning result ["
						+ result + "]");
			}
			return result;

		} else {
			if (log.isDebugEnabled()) {
				log.debug("[CpDettaglioCittadinoAction::handleCbProvinciaNascita_VALUE_CHANGED] dump model after");
				dumpModel(false);
				log.debug("[CpDettaglioCittadinoAction::handleCbProvinciaNascita_VALUE_CHANGED] returning default result [SUCCESS]");
			}
			return SUCCESS;

		}
	}

	/**
	 * Gestione dell'evento VALUE_CHANGED sul widget [cbProvinciaResidenza]
	 */
	@SkipValidation
	@MethodProtection(level = "REJECT_SAME")
	public String handleCbProvinciaResidenza_VALUE_CHANGED()
			throws CommandExecutionException {
		ICommand action = initCommand("cbProvinciaResidenza", "VALUE_CHANGED");
		if (log.isDebugEnabled()) {
			log.debug("[CpDettaglioCittadinoAction::handleCbProvinciaResidenza_VALUE_CHANGED] dump model before");
			dumpModel(false);
		}

		String result = action.doCommand(this);
		if (result != null) {
			if (log.isDebugEnabled()) {
				log.debug("[CpDettaglioCittadinoAction::handleCbProvinciaResidenza_VALUE_CHANGED] dump model after");
				dumpModel(false);
				log.debug("[CpDettaglioCittadinoAction::handleCbProvinciaResidenza_VALUE_CHANGED] returning result ["
						+ result + "]");
			}
			return result;

		} else {
			if (log.isDebugEnabled()) {
				log.debug("[CpDettaglioCittadinoAction::handleCbProvinciaResidenza_VALUE_CHANGED] dump model after");
				dumpModel(false);
				log.debug("[CpDettaglioCittadinoAction::handleCbProvinciaResidenza_VALUE_CHANGED] returning default result [SUCCESS]");
			}
			return SUCCESS;

		}
	}

	/**
	 * Gestione dell'evento CLICKED sul widget [pSalva]
	 */
	@MethodProtection(level = "REJECT_SAME")
	public String handlePSalva_CLICKED() throws CommandExecutionException {
		ICommand action = initCommand("pSalva", "CLICKED");
		if (log.isDebugEnabled()) {
			log.debug("[CpDettaglioCittadinoAction::handlePSalva_CLICKED] dump model before");
			dumpModel(false);
		}

		String result = action.doCommand(this);
		if (result != null) {
			if (log.isDebugEnabled()) {
				log.debug("[CpDettaglioCittadinoAction::handlePSalva_CLICKED] dump model after");
				dumpModel(false);
				log.debug("[CpDettaglioCittadinoAction::handlePSalva_CLICKED] returning result ["
						+ result + "]");
			}
			return result;

		} else {
			if (log.isDebugEnabled()) {
				log.debug("[CpDettaglioCittadinoAction::handlePSalva_CLICKED] dump model after");
				dumpModel(false);
				log.debug("[CpDettaglioCittadinoAction::handlePSalva_CLICKED] returning default result [SUCCESS]");
			}
			return SUCCESS;

		}
	}

	/**
	 * Gestione dell'evento CLICKED sul widget [pAnnulla]
	 */
	@MethodProtection(level = "REJECT_SAME")
	public String handlePAnnulla_CLICKED() throws CommandExecutionException {
		ICommand action = initCommand("pAnnulla", "CLICKED");
		if (log.isDebugEnabled()) {
			log.debug("[CpDettaglioCittadinoAction::handlePAnnulla_CLICKED] dump model before");
			dumpModel(false);
		}

		String result = action.doCommand(this);
		if (result != null) {
			if (log.isDebugEnabled()) {
				log.debug("[CpDettaglioCittadinoAction::handlePAnnulla_CLICKED] dump model after");
				dumpModel(false);
				log.debug("[CpDettaglioCittadinoAction::handlePAnnulla_CLICKED] returning result ["
						+ result + "]");
			}
			return result;

		} else {
			if (log.isDebugEnabled()) {
				log.debug("[CpDettaglioCittadinoAction::handlePAnnulla_CLICKED] dump model after");
				dumpModel(false);
				log.debug("[CpDettaglioCittadinoAction::handlePAnnulla_CLICKED] returning default result [SUCCESS]");
			}
			return SUCCESS;

		}
	}

	//////////////////////////////////////////////////////////////////////////////////
	/// metodo di data providing sull'intero ContentPanel
	/// metodo: provide_CPDATA
	//////////////////////////////////////////////////////////////////////////////////
	//////////////////////////////////////////////////////////////////////////////////
	/// metodi di data providing sui widget dotati di multi data binding
	/// contenuti nel contentPanel
	/// metodo: provide<nomeWidget>_<tipologia dati>
	/// es: provideCbComuni_DATASET
	//////////////////////////////////////////////////////////////////////////////////

	/**
	 * Prepara l'input stream referenziato dal result "provideData" con i valori relativi 
	 * al data-binding relativo al dataset DATASET del widget cbProvinciaNascita.
	 * @return sempre il result "provideData"
	 */
	@SkipValidation
	@FatClientOnly
	public String provideCbProvinciaNascita_DATASET()
			throws CommandExecutionException {

		// reperisce il dato da serializzare
		com.opensymphony.xwork2.ActionContext ctx = com.opensymphony.xwork2.ActionContext
				.getContext();
		Object dataToProvide = ctx.getValueStack().findValue("appDataprovince");

		// serializza
		flexjson.JSONSerializer serializer = new flexjson.JSONSerializer();

		String response = serializer.exclude("*.class").deepSerialize(
				dataToProvide);
		// imposta l'input stream di risposta
		java.io.ByteArrayInputStream bais;
		try {
			bais = new java.io.ByteArrayInputStream(response.getBytes("UTF-8"));
			dataProviderStream = bais;
			// risposta
			return "provideData";
		} catch (java.io.UnsupportedEncodingException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
			throw new CommandExecutionException("errore provide Data", e);
		}
	}

	/**
	 * Prepara l'input stream referenziato dal result "provideData" con i valori relativi 
	 * al data-binding relativo al dataset DATASET del widget cbComuneNascita.
	 * @return sempre il result "provideData"
	 */
	@SkipValidation
	@FatClientOnly
	public String provideCbComuneNascita_DATASET()
			throws CommandExecutionException {

		// reperisce il dato da serializzare
		com.opensymphony.xwork2.ActionContext ctx = com.opensymphony.xwork2.ActionContext
				.getContext();
		Object dataToProvide = ctx.getValueStack().findValue("appDatacomuni");

		// serializza
		flexjson.JSONSerializer serializer = new flexjson.JSONSerializer();

		String response = serializer.exclude("*.class").deepSerialize(
				dataToProvide);
		// imposta l'input stream di risposta
		java.io.ByteArrayInputStream bais;
		try {
			bais = new java.io.ByteArrayInputStream(response.getBytes("UTF-8"));
			dataProviderStream = bais;
			// risposta
			return "provideData";
		} catch (java.io.UnsupportedEncodingException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
			throw new CommandExecutionException("errore provide Data", e);
		}
	}

	/**
	 * Prepara l'input stream referenziato dal result "provideData" con i valori relativi 
	 * al data-binding relativo al dataset DATASET del widget cbProvinciaResidenza.
	 * @return sempre il result "provideData"
	 */
	@SkipValidation
	@FatClientOnly
	public String provideCbProvinciaResidenza_DATASET()
			throws CommandExecutionException {

		// reperisce il dato da serializzare
		com.opensymphony.xwork2.ActionContext ctx = com.opensymphony.xwork2.ActionContext
				.getContext();
		Object dataToProvide = ctx.getValueStack()
				.findValue("appDataprovince2");

		// serializza
		flexjson.JSONSerializer serializer = new flexjson.JSONSerializer();

		String response = serializer.exclude("*.class").deepSerialize(
				dataToProvide);
		// imposta l'input stream di risposta
		java.io.ByteArrayInputStream bais;
		try {
			bais = new java.io.ByteArrayInputStream(response.getBytes("UTF-8"));
			dataProviderStream = bais;
			// risposta
			return "provideData";
		} catch (java.io.UnsupportedEncodingException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
			throw new CommandExecutionException("errore provide Data", e);
		}
	}

	/**
	 * Prepara l'input stream referenziato dal result "provideData" con i valori relativi 
	 * al data-binding relativo al dataset DATASET del widget cbComuneResidenza.
	 * @return sempre il result "provideData"
	 */
	@SkipValidation
	@FatClientOnly
	public String provideCbComuneResidenza_DATASET()
			throws CommandExecutionException {

		// reperisce il dato da serializzare
		com.opensymphony.xwork2.ActionContext ctx = com.opensymphony.xwork2.ActionContext
				.getContext();
		Object dataToProvide = ctx.getValueStack().findValue("appDatacomuni2");

		// serializza
		flexjson.JSONSerializer serializer = new flexjson.JSONSerializer();

		String response = serializer.exclude("*.class").deepSerialize(
				dataToProvide);
		// imposta l'input stream di risposta
		java.io.ByteArrayInputStream bais;
		try {
			bais = new java.io.ByteArrayInputStream(response.getBytes("UTF-8"));
			dataProviderStream = bais;
			// risposta
			return "provideData";
		} catch (java.io.UnsupportedEncodingException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
			throw new CommandExecutionException("errore provide Data", e);
		}
	}

	/**
	 * Gestione della validazione
	 */
	public void validate() {
		/*PROTECTED REGION ID(R1074702876) ENABLED START*/
		/* Inserire la validazione */
		/*PROTECTED REGION END*/
	}

	protected Map<String, UISecConstraint> allVisibilityConstraints = null;
	protected Map<String, UISecConstraint> allOnOffConstraints = null;

	/**
	 * Metodo di preparazione della schermata/action
	 */
	public void prepare() throws CommandExecutionException {
		super.prepare();

		// cancellazione eventuale degli errori di conversione non desiderati
		clearConversionErrorsIfSkipValidation();

		// caricamento struttura di constraints
		if (allVisibilityConstraints == null)
			allVisibilityConstraints = getPageVisibilityUIConstraints();
		if (allOnOffConstraints == null)
			allOnOffConstraints = getPageONOFFUIConstraints();

		// comandi eseguiti ad ogni refresh solo se non sono in modalita' fatclient
		ActionContext ctx = ActionContext.getContext();
		String methodName = ctx.getActionInvocation().getProxy().getMethod();

		if (methodName.startsWith("execute")
				|| (!methodName.startsWith("exec") && !methodName
						.startsWith("provide"))) {
			// comandi eseguiti ad ogni refresh solo per i metodi non fatclient
			ICommand cmd = initOnRefreshCommand();
			cmd.doCommand(this);
		}

	}

	// ridefinizione dei metodi di verifica visibilita'/validazione
	// per supportare i security check

	public boolean isWidgetDisabled(String cpName, String widgShortName) {
		UISecConstraint ctr = allOnOffConstraints.get(widgShortName);
		if (ctr != null) {
			try {
				return !ctr.verifyConstraint(session,
						UISecConstraint.ONOFF_CONSTRAINED_BEHAVIOR,
						getSpringSecurityHelper());
			} catch (BEException ex) {
				log.error("[CpDettaglioCittadinoAction::isWidgetDisabled] errore durante verifica->disable");
				return true; // forzo la DISABILITAZIONE
			}
		} else
			return super.isWidgetDisabled(cpName, widgShortName);
	}

	public boolean isWidgetVisible(String cpName, String widgShortName) {
		UISecConstraint ctr = allVisibilityConstraints.get(widgShortName);
		if (ctr != null) {
			try {
				return ctr.verifyConstraint(session,
						UISecConstraint.VISIB_CONSTRAINED_BEHAVIOR,
						getSpringSecurityHelper());
			} catch (BEException ex) {
				log.error("[CpDettaglioCittadinoAction::isWidgetVisible] errore durante verifica->hide");
				return false; // forzo l'invisibilita'
			}
		} else
			return super.isWidgetVisible(cpName, widgShortName);
	}

	/**
	 * inizializza la struttura dei command da eseguire al refresh del pannello
	 */
	private ICommand initOnRefreshCommand() {
		// ExecCommand begin
		String[] resultNames4gestisciComboDettaglio = new String[]{"Ok"};

		ICommand[] actionsForResults4gestisciComboDettaglio = new ICommand[1];
		/// NOP Command begin
		NOPCommand act_onRefresh_resokAction_0 = new NOPCommand();
		/// NOP Command end
		actionsForResults4gestisciComboDettaglio[0] = act_onRefresh_resokAction_0;

		ExecCommand act_onRefresh_1 = new ExecCommand(
				resultNames4gestisciComboDettaglio,
				actionsForResults4gestisciComboDettaglio) {
			public ExecResults doLogic(Object theModel)
					throws CommandExecutionException {
				it.csi.util.performance.StopWatch watcher = new it.csi.util.performance.StopWatch(
						it.csi.demo.democomp.util.Constants.APPLICATION_CODE);
				ExecResults result = null;
				try {
					watcher.start();
					result = getSpringBackEnd()
							.gestisciComboDettaglio(
									(it.csi.demo.democomp.dto.miaapp.CpDettaglioCittadinoModel) theModel);
					watcher.stop();
					watcher.dumpElapsed("CpDettaglioCittadinoAction",
							"readOne()", "chiamata verso BackEnd",
							"gestisciComboDettaglio");
					return result;
				} catch (BEException e) {
					throw new CommandExecutionException(
							"errore non gestito nell'esecuzione del metodo [gestisciComboDettaglio]:"
									+ e.getMessage(), e);
				}

			}

			public void storeAppData(ExecResults res, BaseAction strutsAction) {
				// cast della action al tipo specifico per poter utilizzare direttamente
				// le property
				CpDettaglioCittadinoAction specificAction = (CpDettaglioCittadinoAction) strutsAction;

				// store del dato cittadino
				//it.csi.demo.democomp.dto.nspersona.Cittadino _appDatacittadino = 
				//	(it.csi.demo.democomp.dto.nspersona.Cittadino)res.getAppDatacittadino();
				// il dato cittadino e' salvato in un attributo della action corrente
				//specificAction.setAppDatacittadino(_appDatacittadino);
				// il dato cittadino e' salvato in sessione
				strutsAction.getSession().put("appDatacittadino",
						specificAction.getAppDatacittadino());
				// store del dato comuni
				//java.util.ArrayList<it.csi.demo.democomp.dto.nspersona.Comune> _appDatacomuni = 
				//	(java.util.ArrayList<it.csi.demo.democomp.dto.nspersona.Comune>)res.getAppDatacomuni();
				// il dato comuni e' salvato in un attributo della action corrente
				//specificAction.setAppDatacomuni(_appDatacomuni);
				// il dato comuni e' salvato in sessione
				strutsAction.getSession().put("appDatacomuni",
						specificAction.getAppDatacomuni());
				// store del dato province
				//java.util.ArrayList<it.csi.demo.democomp.dto.nspersona.Provincia> _appDataprovince = 
				//	(java.util.ArrayList<it.csi.demo.democomp.dto.nspersona.Provincia>)res.getAppDataprovince();
				// il dato province e' salvato in un attributo della action corrente
				//specificAction.setAppDataprovince(_appDataprovince);
				// il dato province e' salvato in sessione
				strutsAction.getSession().put("appDataprovince",
						specificAction.getAppDataprovince());
			}
		};
		// Exec Action end
		return act_onRefresh_1;
	}

	protected Map<String, UISecConstraint> getPageVisibilityUIConstraints() {
		Map<String, UISecConstraint> allConstraints = new HashMap<String, UISecConstraint>();

		// constraint fittizio per mnuMenu
		UISecConstraint mnuMenu_defaultVisib_ctr =

		new DummyUISecConstraint("cpDettaglioCittadino", "mnuMenu",
				UISecConstraint.VISIB_CONSTRAINED_BEHAVIOR, true, true);

		UISecConstraint[] mnuMenu_constraints = new UISecConstraint[]{mnuMenu_defaultVisib_ctr};
		UISecConstraint mnuMenu_ctr = new ComplexUISecConstraint(
				mnuMenu_constraints);
		allConstraints.put("mnuMenu", mnuMenu_ctr);

		// constraint fittizio per tfCognome
		UISecConstraint tfCognome_defaultVisib_ctr =

		new DummyUISecConstraint("cpDettaglioCittadino", "tfCognome",
				UISecConstraint.VISIB_CONSTRAINED_BEHAVIOR, true, true);

		UISecConstraint[] tfCognome_constraints = new UISecConstraint[]{tfCognome_defaultVisib_ctr};
		UISecConstraint tfCognome_ctr = new ComplexUISecConstraint(
				tfCognome_constraints);
		allConstraints.put("tfCognome", tfCognome_ctr);

		// constraint fittizio per tfNome
		UISecConstraint tfNome_defaultVisib_ctr =

		new DummyUISecConstraint("cpDettaglioCittadino", "tfNome",
				UISecConstraint.VISIB_CONSTRAINED_BEHAVIOR, true, true);

		UISecConstraint[] tfNome_constraints = new UISecConstraint[]{tfNome_defaultVisib_ctr};
		UISecConstraint tfNome_ctr = new ComplexUISecConstraint(
				tfNome_constraints);
		allConstraints.put("tfNome", tfNome_ctr);

		// constraint fittizio per rbSesso
		UISecConstraint rbSesso_defaultVisib_ctr =

		new DummyUISecConstraint("cpDettaglioCittadino", "rbSesso",
				UISecConstraint.VISIB_CONSTRAINED_BEHAVIOR, true, true);

		UISecConstraint[] rbSesso_constraints = new UISecConstraint[]{rbSesso_defaultVisib_ctr};
		UISecConstraint rbSesso_ctr = new ComplexUISecConstraint(
				rbSesso_constraints);
		allConstraints.put("rbSesso", rbSesso_ctr);

		// constraint fittizio per cDataNascita
		UISecConstraint cDataNascita_defaultVisib_ctr =

		new DummyUISecConstraint("cpDettaglioCittadino", "cDataNascita",
				UISecConstraint.VISIB_CONSTRAINED_BEHAVIOR, true, true);

		UISecConstraint[] cDataNascita_constraints = new UISecConstraint[]{cDataNascita_defaultVisib_ctr};
		UISecConstraint cDataNascita_ctr = new ComplexUISecConstraint(
				cDataNascita_constraints);
		allConstraints.put("cDataNascita", cDataNascita_ctr);

		// constraint fittizio per cbProvinciaNascita
		UISecConstraint cbProvinciaNascita_defaultVisib_ctr =

		new DummyUISecConstraint("cpDettaglioCittadino", "cbProvinciaNascita",
				UISecConstraint.VISIB_CONSTRAINED_BEHAVIOR, true, true);

		UISecConstraint[] cbProvinciaNascita_constraints = new UISecConstraint[]{cbProvinciaNascita_defaultVisib_ctr};
		UISecConstraint cbProvinciaNascita_ctr = new ComplexUISecConstraint(
				cbProvinciaNascita_constraints);
		allConstraints.put("cbProvinciaNascita", cbProvinciaNascita_ctr);

		// constraint fittizio per cbComuneNascita
		UISecConstraint cbComuneNascita_defaultVisib_ctr =

		new DummyUISecConstraint("cpDettaglioCittadino", "cbComuneNascita",
				UISecConstraint.VISIB_CONSTRAINED_BEHAVIOR, true, true);

		UISecConstraint[] cbComuneNascita_constraints = new UISecConstraint[]{cbComuneNascita_defaultVisib_ctr};
		UISecConstraint cbComuneNascita_ctr = new ComplexUISecConstraint(
				cbComuneNascita_constraints);
		allConstraints.put("cbComuneNascita", cbComuneNascita_ctr);

		// constraint fittizio per cbProvinciaResidenza
		UISecConstraint cbProvinciaResidenza_defaultVisib_ctr =

		new DummyUISecConstraint("cpDettaglioCittadino",
				"cbProvinciaResidenza",
				UISecConstraint.VISIB_CONSTRAINED_BEHAVIOR, true, true);

		UISecConstraint[] cbProvinciaResidenza_constraints = new UISecConstraint[]{cbProvinciaResidenza_defaultVisib_ctr};
		UISecConstraint cbProvinciaResidenza_ctr = new ComplexUISecConstraint(
				cbProvinciaResidenza_constraints);
		allConstraints.put("cbProvinciaResidenza", cbProvinciaResidenza_ctr);

		// constraint fittizio per cbComuneResidenza
		UISecConstraint cbComuneResidenza_defaultVisib_ctr =

		new DummyUISecConstraint("cpDettaglioCittadino", "cbComuneResidenza",
				UISecConstraint.VISIB_CONSTRAINED_BEHAVIOR, true, true);

		UISecConstraint[] cbComuneResidenza_constraints = new UISecConstraint[]{cbComuneResidenza_defaultVisib_ctr};
		UISecConstraint cbComuneResidenza_ctr = new ComplexUISecConstraint(
				cbComuneResidenza_constraints);
		allConstraints.put("cbComuneResidenza", cbComuneResidenza_ctr);

		// constraint fittizio per tfRetribuzione
		UISecConstraint tfRetribuzione_defaultVisib_ctr =

		new DummyUISecConstraint("cpDettaglioCittadino", "tfRetribuzione",
				UISecConstraint.VISIB_CONSTRAINED_BEHAVIOR, true, true);

		UISecConstraint[] tfRetribuzione_constraints = new UISecConstraint[]{tfRetribuzione_defaultVisib_ctr};
		UISecConstraint tfRetribuzione_ctr = new ComplexUISecConstraint(
				tfRetribuzione_constraints);
		allConstraints.put("tfRetribuzione", tfRetribuzione_ctr);

		// constraint fittizio per pSalva
		UISecConstraint pSalva_defaultVisib_ctr =

		new DummyUISecConstraint("cpDettaglioCittadino", "pSalva",
				UISecConstraint.VISIB_CONSTRAINED_BEHAVIOR, true, true);

		UISecConstraint[] pSalva_constraints = new UISecConstraint[]{pSalva_defaultVisib_ctr};
		UISecConstraint pSalva_ctr = new ComplexUISecConstraint(
				pSalva_constraints);
		allConstraints.put("pSalva", pSalva_ctr);

		// constraint fittizio per pAnnulla
		UISecConstraint pAnnulla_defaultVisib_ctr =

		new DummyUISecConstraint("cpDettaglioCittadino", "pAnnulla",
				UISecConstraint.VISIB_CONSTRAINED_BEHAVIOR, true, true);

		UISecConstraint[] pAnnulla_constraints = new UISecConstraint[]{pAnnulla_defaultVisib_ctr};
		UISecConstraint pAnnulla_ctr = new ComplexUISecConstraint(
				pAnnulla_constraints);
		allConstraints.put("pAnnulla", pAnnulla_ctr);
		return allConstraints;
	}

	protected Map<String, UISecConstraint> getPageONOFFUIConstraints() {
		Map<String, UISecConstraint> allConstraints = new HashMap<String, UISecConstraint>();

		// constraint fittizio per mnuMenu
		UISecConstraint mnuMenu_defaultOnoff_ctr =

		new DummyUISecConstraint("cpDettaglioCittadino", "mnuMenu",
				UISecConstraint.ONOFF_CONSTRAINED_BEHAVIOR, true, true);

		UISecConstraint[] mnuMenu_constraints = new UISecConstraint[]{mnuMenu_defaultOnoff_ctr};
		UISecConstraint mnuMenu_ctr = new ComplexUISecConstraint(
				mnuMenu_constraints);
		allConstraints.put("mnuMenu", mnuMenu_ctr);

		// constraint fittizio per tfCognome
		UISecConstraint tfCognome_defaultOnoff_ctr =

		new DummyUISecConstraint("cpDettaglioCittadino", "tfCognome",
				UISecConstraint.ONOFF_CONSTRAINED_BEHAVIOR, true, true);

		UISecConstraint[] tfCognome_constraints = new UISecConstraint[]{tfCognome_defaultOnoff_ctr};
		UISecConstraint tfCognome_ctr = new ComplexUISecConstraint(
				tfCognome_constraints);
		allConstraints.put("tfCognome", tfCognome_ctr);

		// constraint fittizio per tfNome
		UISecConstraint tfNome_defaultOnoff_ctr =

		new DummyUISecConstraint("cpDettaglioCittadino", "tfNome",
				UISecConstraint.ONOFF_CONSTRAINED_BEHAVIOR, true, true);

		UISecConstraint[] tfNome_constraints = new UISecConstraint[]{tfNome_defaultOnoff_ctr};
		UISecConstraint tfNome_ctr = new ComplexUISecConstraint(
				tfNome_constraints);
		allConstraints.put("tfNome", tfNome_ctr);

		// constraint fittizio per rbSesso
		UISecConstraint rbSesso_defaultOnoff_ctr =

		new DummyUISecConstraint("cpDettaglioCittadino", "rbSesso",
				UISecConstraint.ONOFF_CONSTRAINED_BEHAVIOR, true, true);

		UISecConstraint[] rbSesso_constraints = new UISecConstraint[]{rbSesso_defaultOnoff_ctr};
		UISecConstraint rbSesso_ctr = new ComplexUISecConstraint(
				rbSesso_constraints);
		allConstraints.put("rbSesso", rbSesso_ctr);

		// constraint fittizio per cDataNascita
		UISecConstraint cDataNascita_defaultOnoff_ctr =

		new DummyUISecConstraint("cpDettaglioCittadino", "cDataNascita",
				UISecConstraint.ONOFF_CONSTRAINED_BEHAVIOR, true, true);

		UISecConstraint[] cDataNascita_constraints = new UISecConstraint[]{cDataNascita_defaultOnoff_ctr};
		UISecConstraint cDataNascita_ctr = new ComplexUISecConstraint(
				cDataNascita_constraints);
		allConstraints.put("cDataNascita", cDataNascita_ctr);

		// constraint fittizio per cbProvinciaNascita
		UISecConstraint cbProvinciaNascita_defaultOnoff_ctr =

		new DummyUISecConstraint("cpDettaglioCittadino", "cbProvinciaNascita",
				UISecConstraint.ONOFF_CONSTRAINED_BEHAVIOR, true, true);

		UISecConstraint[] cbProvinciaNascita_constraints = new UISecConstraint[]{cbProvinciaNascita_defaultOnoff_ctr};
		UISecConstraint cbProvinciaNascita_ctr = new ComplexUISecConstraint(
				cbProvinciaNascita_constraints);
		allConstraints.put("cbProvinciaNascita", cbProvinciaNascita_ctr);

		// constraint fittizio per cbComuneNascita
		UISecConstraint cbComuneNascita_defaultOnoff_ctr =

		new DummyUISecConstraint("cpDettaglioCittadino", "cbComuneNascita",
				UISecConstraint.ONOFF_CONSTRAINED_BEHAVIOR, true, true);

		UISecConstraint[] cbComuneNascita_constraints = new UISecConstraint[]{cbComuneNascita_defaultOnoff_ctr};
		UISecConstraint cbComuneNascita_ctr = new ComplexUISecConstraint(
				cbComuneNascita_constraints);
		allConstraints.put("cbComuneNascita", cbComuneNascita_ctr);

		// constraint fittizio per cbProvinciaResidenza
		UISecConstraint cbProvinciaResidenza_defaultOnoff_ctr =

		new DummyUISecConstraint("cpDettaglioCittadino",
				"cbProvinciaResidenza",
				UISecConstraint.ONOFF_CONSTRAINED_BEHAVIOR, true, true);

		UISecConstraint[] cbProvinciaResidenza_constraints = new UISecConstraint[]{cbProvinciaResidenza_defaultOnoff_ctr};
		UISecConstraint cbProvinciaResidenza_ctr = new ComplexUISecConstraint(
				cbProvinciaResidenza_constraints);
		allConstraints.put("cbProvinciaResidenza", cbProvinciaResidenza_ctr);

		// constraint fittizio per cbComuneResidenza
		UISecConstraint cbComuneResidenza_defaultOnoff_ctr =

		new DummyUISecConstraint("cpDettaglioCittadino", "cbComuneResidenza",
				UISecConstraint.ONOFF_CONSTRAINED_BEHAVIOR, true, true);

		UISecConstraint[] cbComuneResidenza_constraints = new UISecConstraint[]{cbComuneResidenza_defaultOnoff_ctr};
		UISecConstraint cbComuneResidenza_ctr = new ComplexUISecConstraint(
				cbComuneResidenza_constraints);
		allConstraints.put("cbComuneResidenza", cbComuneResidenza_ctr);

		// constraint fittizio per tfRetribuzione
		UISecConstraint tfRetribuzione_defaultOnoff_ctr =

		new DummyUISecConstraint("cpDettaglioCittadino", "tfRetribuzione",
				UISecConstraint.ONOFF_CONSTRAINED_BEHAVIOR, true, true);

		UISecConstraint[] tfRetribuzione_constraints = new UISecConstraint[]{tfRetribuzione_defaultOnoff_ctr};
		UISecConstraint tfRetribuzione_ctr = new ComplexUISecConstraint(
				tfRetribuzione_constraints);
		allConstraints.put("tfRetribuzione", tfRetribuzione_ctr);

		// constraint fittizio per pSalva
		UISecConstraint pSalva_defaultOnoff_ctr =

		new DummyUISecConstraint("cpDettaglioCittadino", "pSalva",
				UISecConstraint.ONOFF_CONSTRAINED_BEHAVIOR, true, true);

		UISecConstraint[] pSalva_constraints = new UISecConstraint[]{pSalva_defaultOnoff_ctr};
		UISecConstraint pSalva_ctr = new ComplexUISecConstraint(
				pSalva_constraints);
		allConstraints.put("pSalva", pSalva_ctr);

		// constraint fittizio per pAnnulla
		UISecConstraint pAnnulla_defaultOnoff_ctr =

		new DummyUISecConstraint("cpDettaglioCittadino", "pAnnulla",
				UISecConstraint.ONOFF_CONSTRAINED_BEHAVIOR, true, true);

		UISecConstraint[] pAnnulla_constraints = new UISecConstraint[]{pAnnulla_defaultOnoff_ctr};
		UISecConstraint pAnnulla_ctr = new ComplexUISecConstraint(
				pAnnulla_constraints);
		allConstraints.put("pAnnulla", pAnnulla_ctr);
		return allConstraints;
	}

	/**  */
	void dumpModel(boolean pre) {
		log.debug("[CpDettaglioCittadinoAction::dumpmodel] START");

		log.debug("[CpDettaglioCittadinoAction::dumpmodel] #### DUMP del model della action "
				+ this.getClass()
				+ (pre ? " prima dell'azione" : " dopo l'azione"));
		log.debug("[CpDettaglioCittadinoAction::dumpmodel] [a] campi pubblici del model");
		try {
			java.beans.BeanInfo bi = java.beans.Introspector.getBeanInfo(this
					.getClass());
			java.beans.PropertyDescriptor[] props = bi.getPropertyDescriptors();
			for (int i = 0; i < props.length; i++) {
				java.beans.PropertyDescriptor pd = props[i];
				java.lang.reflect.Method m = pd.getReadMethod();
				if (m != null) {
					Object pval = m.invoke(this, new Object[]{});
					log.debug("[CpDettaglioCittadinoAction::dumpmodel] "
							+ pd.getName() + ":" + pval);
				}
			}
		} catch (IllegalAccessException e) {
			log.error("[CpDettaglioCittadinoAction::dumpmodel] Errore nel dump"
					+ e + ", ignoro");
		} catch (InvocationTargetException e) {
			log.error("[CpDettaglioCittadinoAction::dumpmodel] Errore nel dump"
					+ e + ", ignoro");
		} catch (IntrospectionException e) {
			log.error("[CpDettaglioCittadinoAction::dumpmodel] Errore nel dump"
					+ e + ", ignoro");
		}
		log.debug("[CpDettaglioCittadinoAction::dumpmodel] [b] stato dei widget");
		Object cpWidgetStatus = session.get("cpDettaglioCittadino");
		log.debug("[CpDettaglioCittadinoAction::dumpmodel] " + cpWidgetStatus);
		log.debug("[CpDettaglioCittadinoAction::dumpmodel] [c] sessione");
		log.debug("[CpDettaglioCittadinoAction::dumpmodel] " + session);
	}

	static final String PENDING_CLEAR_COMMAND_ATTRIBUTE = "_pending_clear_command_";
	/**
	 *	Metodo per la rimozione dalla sessione degli application data a scope
	 *  SAME_PAGE. 
	 */
	public void clearPageScopedAppData() {
		// nothing to clear...
	}

	/**
	 * inizializza la struttura dei command da eseguire per ciascun event handler 
	 * di ciascun widget
	 */
	private ICommand initCommand(String sourceWidget, String eventType) {
		HashMap<String, HashMap<String, ICommand>> cmdsByWidget = new HashMap<String, HashMap<String, ICommand>>();

		// contiene i comandi del widget cbProvinciaNascita per ogni Ev.H.
		HashMap<String, ICommand> cmds4cbProvinciaNascitaByEvh = new HashMap<String, ICommand>();

		cmds4cbProvinciaNascitaByEvh.put("VALUE_CHANGED",
				initCommandCbProvinciaNascita_VALUE_CHANGED());
		cmdsByWidget.put("cbProvinciaNascita", cmds4cbProvinciaNascitaByEvh);
		// contiene i comandi del widget cbProvinciaResidenza per ogni Ev.H.
		HashMap<String, ICommand> cmds4cbProvinciaResidenzaByEvh = new HashMap<String, ICommand>();

		cmds4cbProvinciaResidenzaByEvh.put("VALUE_CHANGED",
				initCommandCbProvinciaResidenza_VALUE_CHANGED());
		cmdsByWidget
				.put("cbProvinciaResidenza", cmds4cbProvinciaResidenzaByEvh);
		// contiene i comandi del widget pSalva per ogni Ev.H.
		HashMap<String, ICommand> cmds4pSalvaByEvh = new HashMap<String, ICommand>();

		cmds4pSalvaByEvh.put("CLICKED", initCommandPSalva_CLICKED());
		cmdsByWidget.put("pSalva", cmds4pSalvaByEvh);
		// contiene i comandi del widget pAnnulla per ogni Ev.H.
		HashMap<String, ICommand> cmds4pAnnullaByEvh = new HashMap<String, ICommand>();

		cmds4pAnnullaByEvh.put("CLICKED", initCommandPAnnulla_CLICKED());
		cmdsByWidget.put("pAnnulla", cmds4pAnnullaByEvh);

		ICommand ris = cmdsByWidget.get(sourceWidget).get(eventType);
		if (ris != null)
			return ris;
		else
			return new ICommand() { // NOP..
				public String doCommand(BaseAction strutsAction)
						throws CommandExecutionException {
					return null;
				}
			};
	}

	private ICommand initCommandCbProvinciaNascita_VALUE_CHANGED() {
		/// Refresh Command begin
		String[] act_actions_value_changed_cbProvinciaNascita_1_panels = new String[]{"pCampi"};
		String[] act_actions_value_changed_cbProvinciaNascita_1_widgets = new String[]{
				"cbProvinciaNascita", "cbProvinciaResidenza",
				"cbComuneNascita", "cbComuneResidenza"};
		RefreshViewCommand act_actions_value_changed_cbProvinciaNascita_1 = new RefreshViewCommand(
				"cpDettaglioCittadino",
				act_actions_value_changed_cbProvinciaNascita_1_panels,
				act_actions_value_changed_cbProvinciaNascita_1_widgets);

		/// Refresh Command end
		return act_actions_value_changed_cbProvinciaNascita_1;
	}

	private ICommand initCommandCbProvinciaResidenza_VALUE_CHANGED() {
		/// Refresh Command begin
		String[] act_actions_value_changed_cbProvinciaResidenza_1_panels = new String[]{"pCampi"};
		String[] act_actions_value_changed_cbProvinciaResidenza_1_widgets = new String[]{
				"cbProvinciaResidenza", "cbProvinciaNascita",
				"cbComuneNascita", "cbComuneResidenza"};
		RefreshViewCommand act_actions_value_changed_cbProvinciaResidenza_1 = new RefreshViewCommand(
				"cpDettaglioCittadino",
				act_actions_value_changed_cbProvinciaResidenza_1_panels,
				act_actions_value_changed_cbProvinciaResidenza_1_widgets);

		/// Refresh Command end
		return act_actions_value_changed_cbProvinciaResidenza_1;
	}

	private ICommand initCommandPSalva_CLICKED() {
		// ExecCommand begin
		String[] resultNames4salvaDatiCittadino = new String[]{"Ok"};

		ICommand[] actionsForResults4salvaDatiCittadino = new ICommand[1];
		/// Jump Command begin
		JumpCommand act_actions_clicked_pSalva_resokAction_0 = new JumpCommand(
				"cpHome", null, false);
		/// Jump Command end
		actionsForResults4salvaDatiCittadino[0] = act_actions_clicked_pSalva_resokAction_0;

		ExecCommand act_actions_clicked_pSalva_1 = new ExecCommand(
				resultNames4salvaDatiCittadino,
				actionsForResults4salvaDatiCittadino) {
			public ExecResults doLogic(Object theModel)
					throws CommandExecutionException {
				it.csi.util.performance.StopWatch watcher = new it.csi.util.performance.StopWatch(
						it.csi.demo.democomp.util.Constants.APPLICATION_CODE);
				ExecResults result = null;
				try {
					watcher.start();
					result = getSpringBackEnd()
							.salvaDatiCittadino(
									(it.csi.demo.democomp.dto.miaapp.CpDettaglioCittadinoModel) theModel);
					watcher.stop();
					watcher.dumpElapsed("CpDettaglioCittadinoAction",
							"readOne()", "chiamata verso BackEnd",
							"salvaDatiCittadino");
					return result;
				} catch (BEException e) {
					throw new CommandExecutionException(
							"errore non gestito nell'esecuzione del metodo [salvaDatiCittadino]:"
									+ e.getMessage(), e);
				}

			}

			public void storeAppData(ExecResults res, BaseAction strutsAction) {
				// nothing to store...
			}
		};
		// Exec Action end
		return act_actions_clicked_pSalva_1;
	}

	private ICommand initCommandPAnnulla_CLICKED() {
		// ExecCommand begin
		String[] resultNames4tornaIndietro = new String[]{"Ok"};

		ICommand[] actionsForResults4tornaIndietro = new ICommand[1];
		/// Jump Command begin
		JumpCommand act_actions_clicked_pAnnulla_resokAction_0 = new JumpCommand(
				"cpHome", null, false);
		/// Jump Command end
		actionsForResults4tornaIndietro[0] = act_actions_clicked_pAnnulla_resokAction_0;

		ExecCommand act_actions_clicked_pAnnulla_1 = new ExecCommand(
				resultNames4tornaIndietro, actionsForResults4tornaIndietro) {
			public ExecResults doLogic(Object theModel)
					throws CommandExecutionException {
				it.csi.util.performance.StopWatch watcher = new it.csi.util.performance.StopWatch(
						it.csi.demo.democomp.util.Constants.APPLICATION_CODE);
				ExecResults result = null;
				try {
					watcher.start();
					result = getSpringBackEnd()
							.tornaIndietro(
									(it.csi.demo.democomp.dto.miaapp.CpDettaglioCittadinoModel) theModel);
					watcher.stop();
					watcher.dumpElapsed("CpDettaglioCittadinoAction",
							"readOne()", "chiamata verso BackEnd",
							"tornaIndietro");
					return result;
				} catch (BEException e) {
					throw new CommandExecutionException(
							"errore non gestito nell'esecuzione del metodo [tornaIndietro]:"
									+ e.getMessage(), e);
				}

			}

			public void storeAppData(ExecResults res, BaseAction strutsAction) {
				// nothing to store...
			}
		};
		// Exec Action end
		return act_actions_clicked_pAnnulla_1;
	}

	@SkipValidation
	public String handleChangeTab() {
		if (this.hasActionErrors() || this.hasFieldErrors() || this.hasErrors())
			return INPUT;
		else {
			session.put(selectedTabKey, selectedTabValue);
			return SUCCESS;
		}
	}

}
