/**
 ********************************************************************************
 * Copyright (c) 2020-2021 Robert Bosch GmbH.
 * 
 * This program and the accompanying materials are made
 * available under the terms of the Eclipse Public License 2.0
 * which is available at https://www.eclipse.org/legal/epl-2.0/
 * 
 * SPDX-License-Identifier: EPL-2.0
 * 
 * Contributors:
 *     Robert Bosch GmbH - initial API and implementation
 * *******************************************************************************
 */

package org.eclipse.app4mc.slg.ros2.transformers.sw;

import com.google.inject.Inject;
import com.google.inject.Singleton;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.Map;
import org.eclipse.app4mc.amalthea.model.ChannelSend;
import org.eclipse.app4mc.slg.commons.m2t.generators.TranslationUnit;
import org.eclipse.app4mc.slg.commons.m2t.transformers.SLGBaseTransformer;
import org.eclipse.app4mc.slg.ros2.generators.RosChannelSendUtilsTranslationUnit;
import org.eclipse.app4mc.transformation.util.OutputBuffer;
import org.eclipse.xtext.xbase.lib.CollectionLiterals;

@Singleton
public class RosChannelSendUtilsTransformer extends SLGBaseTransformer {

	@Inject private OutputBuffer outputBuffer;

	private final HashMap<ArrayList<?>, RosChannelSendUtilsTranslationUnit> cache = CollectionLiterals
			.newHashMap();

	public RosChannelSendUtilsTranslationUnit generate(final ChannelSend cs) {
		return this.generateIntern(cs);	// hash according to class not instance
	}

	public RosChannelSendUtilsTranslationUnit generateIntern(final ChannelSend cs) {
		final ArrayList<?> key = CollectionLiterals.newArrayList(cs);
		final RosChannelSendUtilsTranslationUnit _result;
		synchronized (cache) {
			if (cache.containsKey(key)) {
				return cache.get(key);
			}
			RosChannelSendUtilsTranslationUnit _rosChannelSendUtilsTranslationUnit = new RosChannelSendUtilsTranslationUnit(
					this.outputBuffer, cs);
			_result = _rosChannelSendUtilsTranslationUnit;
			cache.put(key, _result);
		}
		_init_generateIntern(_result, cs);
		return _result;
	}


	private void _init_generateIntern(final RosChannelSendUtilsTranslationUnit it, final ChannelSend cs) {
	}

	@Override
	public Map<ArrayList<?>, ? extends TranslationUnit> getCache() {
		return this.cache;
	}

}
