/**
 ********************************************************************************
 * 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.SLGBaseTransformer;
import org.eclipse.app4mc.slg.commons.m2t.generators.TranslationUnit;
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;
	}

}
