All Downloads are FREE. Search and download functionalities are using the official Maven repository.

com.ecfeed.core.operations.GenericOperationRemoveChoice Maven / Gradle / Ivy

/*******************************************************************************
 *
 * Copyright (c) 2016 ecFeed AS.                                                
 * All rights reserved. This program and the accompanying materials              
 * are made available under the terms of the Eclipse Public License v1.0         
 * which accompanies this distribution, and is available at                      
 * http://www.eclipse.org/legal/epl-v10.html 
 *  
 *******************************************************************************/

package com.ecfeed.core.operations;

import java.util.Set;

import com.ecfeed.core.model.ChoiceNode;
import com.ecfeed.core.model.ChoicesParentNode;
import com.ecfeed.core.model.GlobalParameterNode;
import com.ecfeed.core.model.IParameterVisitor;
import com.ecfeed.core.model.MethodNode;
import com.ecfeed.core.model.MethodParameterNode;
import com.ecfeed.core.model.ModelOperationException;
import com.ecfeed.core.type.adapter.ITypeAdapter;
import com.ecfeed.core.type.adapter.ITypeAdapterProvider;
import com.ecfeed.core.utils.ERunMode;
import com.ecfeed.core.utils.JavaTypeHelper;
import com.ecfeed.core.utils.SystemLogger;

public class GenericOperationRemoveChoice extends BulkOperation {

	private class RemoveChoiceOperation extends AbstractModelOperation {

		private ChoicesParentNode fTarget;
		private ChoiceNode fChoice;
		private String fOriginalDefaultValue;
		private int fOriginalIndex;
		private ITypeAdapterProvider fAdapterProvider;

		private class ReverseOperation extends AbstractModelOperation{

			private class ReverseParameterAdapter implements IParameterVisitor{

				@Override
				public Object visit(MethodParameterNode node) throws Exception {
					node.setDefaultValueString(fOriginalDefaultValue);
					return null;
				}

				@Override
				public Object visit(GlobalParameterNode node) throws Exception {
					return null;
				}

			}

			public ReverseOperation() {
				super(RemoveChoiceOperation.this.getName());
			}

			@Override
			public void execute() throws ModelOperationException {

				setOneNodeToSelect(fTarget);
				fTarget.addChoice(fChoice, fOriginalIndex);
				reverseAdaptParameter();
				markModelUpdated();
			}

			@Override
			public IModelOperation getReverseOperation() {
				return new RemoveChoiceOperation(fTarget, fChoice, fAdapterProvider);
			}

			private void reverseAdaptParameter() {
				try{
					fTarget.getParameter().accept(new ReverseParameterAdapter());
				}catch(Exception e){SystemLogger.logCatch(e);}
			}

		}

		private class OperationValidator implements IParameterVisitor{

			@Override
			public Object visit(MethodParameterNode parameter) throws Exception {
				if(parameter.isExpected() && JavaTypeHelper.isJavaType(parameter.getType()) == false && parameter.getChoices().size() == 1 && parameter.getChoices().get(0) == fChoice){
					// We are removing the only choice of expected parameter.
					// The last parameter must represent the default expected value
					ModelOperationException.report(OperationMessages.EXPECTED_USER_TYPE_CATEGORY_LAST_PARTITION_PROBLEM);
				}
				return null;
			}

			@Override
			public Object visit(GlobalParameterNode node) throws Exception {
				return null;
			}
		}

		private class ParameterAdapter implements IParameterVisitor{

			@Override
			public Object visit(MethodParameterNode parameter) throws Exception {
				fOriginalDefaultValue = parameter.getDefaultValue();
				if(parameter.isExpected() && fChoice.getValueString().equals(parameter.getDefaultValue())){
					// the value of removed choice is the same as default expected value
					// Check if there are leaf choices with the same value. If not, update the default value
					Set leafValues = parameter.getLeafChoiceValues();
					if(leafValues.contains(parameter.getDefaultValue()) == false){
						if(leafValues.size() > 0){
							parameter.setDefaultValueString(leafValues.toArray(new String[]{})[0]);
						}
						else{
							ModelOperationException.report(OperationMessages.UNEXPECTED_PROBLEM_WHILE_REMOVING_ELEMENT);
						}
					}
				}
				return null;
			}

			@Override
			public Object visit(GlobalParameterNode node) throws Exception {
				return null;
			}

		}

		public RemoveChoiceOperation(ChoicesParentNode target, ChoiceNode choice, ITypeAdapterProvider adapterProvider){
			super(OperationNames.REMOVE_PARTITION);
			fAdapterProvider = adapterProvider;
			fTarget = target;
			fChoice = choice;
			fOriginalIndex = fChoice.getMyIndex();
		}

		@Override
		public void execute() throws ModelOperationException {

			setOneNodeToSelect(fTarget);
			fOriginalIndex = fChoice.getMyIndex();
			validateOperation();
			fTarget.removeChoice(fChoice);
			adaptParameter();
			if(fChoice.getParent() instanceof ChoiceNode){
				adaptParentChoice((ChoiceNode)fChoice.getParent());
			}
		}

		private void adaptParentChoice(ChoiceNode parentChoiceNode) {
			if(parentChoiceNode.isAbstract() == false){
				ITypeAdapter adapter = fAdapterProvider.getAdapter(parentChoiceNode.getParameter().getType());
				String newValue = 
						adapter.convert(
								parentChoiceNode.getValueString(), 
								parentChoiceNode.isRandomizedValue(),
								ERunMode.QUIET);

				if(newValue == null){
					newValue = adapter.getDefaultValue();
				}
				parentChoiceNode.setValueString(newValue);
			}
		}

		private void adaptParameter() {
			try{
				fTarget.getParameter().accept(new ParameterAdapter());
			}catch(Exception e){SystemLogger.logCatch(e);}
		}

		private void validateOperation() throws ModelOperationException {
			try{
				if(fTarget.getParameter() != null){
					fTarget.getParameter().accept(new OperationValidator());
				}
			}catch(Exception e){
				throw (ModelOperationException)e;
			}
		}

		@Override
		public IModelOperation getReverseOperation() {
			return new ReverseOperation();
		}

	}

	public GenericOperationRemoveChoice(
			ChoicesParentNode target, 
			ChoiceNode choice, 
			ITypeAdapterProvider adapterProvider, 
			boolean validate) {

		super(OperationNames.REMOVE_PARTITION, true, target, target);

		addOperation(new RemoveChoiceOperation(target, choice, adapterProvider));

		if (validate) {
			for (MethodNode method : target.getParameter().getMethods()) {
				addOperation(new MethodOperationMakeConsistent(method));
			}
		}
	}
}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy