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

com.ecfeed.core.implementation.CachedImplementationStatusResolver 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.implementation;

import java.util.HashMap;
import java.util.Map;

import com.ecfeed.core.model.AbstractNode;
import com.ecfeed.core.model.ChoiceNode;
import com.ecfeed.core.model.ClassNode;
import com.ecfeed.core.model.ConstraintNode;
import com.ecfeed.core.model.GlobalParameterNode;
import com.ecfeed.core.model.IModelVisitor;
import com.ecfeed.core.model.MethodNode;
import com.ecfeed.core.model.MethodParameterNode;
import com.ecfeed.core.model.RootNode;
import com.ecfeed.core.model.TestCaseNode;
import com.ecfeed.core.type.adapter.IPrimitiveTypePredicate;
import com.ecfeed.core.utils.SystemLogger;


public abstract class CachedImplementationStatusResolver extends AbstractImplementationStatusResolver {

	private static Map fCache = new HashMap<>();


	public CachedImplementationStatusResolver(IPrimitiveTypePredicate primitiveTypePredicate) {
		super(primitiveTypePredicate);
	}

	@Override
	public EImplementationStatus getImplementationStatus(AbstractNode node) {

		EImplementationStatus status = fCache.get(node);

		if (status == null) {
			status = super.getImplementationStatus(node);
			updateCache(node, status);
		}

		return status;
	}

	public static void clearCache(AbstractNode node) {

		if (node == null) {
			return;
		}

		try {
			node.accept(new CacheCleaner());
		} catch(Exception e) {
			SystemLogger.logCatch(e);
		}

		clearCache(node.getParent());
	}

	public void updateCache(AbstractNode node, EImplementationStatus status) {

		fCache.put(node, status);

		if (node != null && node.getParent() != null) {
			clearCache(node.getParent());
		}
	}

	public static void clearCache() {
		fCache.clear();
	}

	private static class CacheCleaner implements IModelVisitor{

		@Override
		public Object visit(RootNode node) throws Exception {
			fCache.remove(node);
			return null;
		}

		@Override
		public Object visit(ClassNode node) throws Exception {
			fCache.remove(node);
			return null;
		}

		@Override
		public Object visit(MethodNode node) throws Exception {
			fCache.remove(node);
			return null;
		}

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

		@Override
		public Object visit(GlobalParameterNode node) throws Exception {
			fCache.remove(node);

			for (MethodParameterNode parameter : node.getLinkers()) {
				fCache.remove(parameter);
			}

			return null;
		}

		@Override
		public Object visit(TestCaseNode node) throws Exception {

			fCache.remove(node);
			return null;
		}

		@Override
		public Object visit(ConstraintNode node) throws Exception {

			fCache.remove(node);
			return null;
		}

		@Override
		public Object visit(ChoiceNode node) throws Exception {

			fCache.remove(node);

			for (MethodNode method : node.getParameter().getMethods()) {
				for (TestCaseNode testCase : method.getMentioningTestCases(node)) {
					fCache.remove(testCase);
				}
			}

			return null;
		}

	}

}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy