/**
*
* Copyright (c) 2006-2017, Speedment, Inc. All Rights Reserved.
*
* Licensed under the Apache License, Version 2.0 (the "License"); You may not
* use this file except in compliance with the License. You may obtain a copy of
* the License at:
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
* WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
* License for the specific language governing permissions and limitations under
* the License.
*/
package com.speedment.generator.translator.component;
import com.speedment.common.codegen.model.ClassOrInterface;
import com.speedment.common.injector.annotation.InjectKey;
import com.speedment.generator.translator.Translator;
import com.speedment.generator.translator.TranslatorConstructor;
import com.speedment.generator.translator.TranslatorDecorator;
import com.speedment.generator.translator.TranslatorKey;
import com.speedment.generator.translator.exception.SpeedmentTranslatorException;
import com.speedment.runtime.config.trait.HasMainInterface;
import com.speedment.runtime.config.trait.HasName;
import java.util.stream.Stream;
/**
* This Component interface is used for Speedments's code generation.
*
* @author Per Minborg
* @author Emil Forslund
* @since 2.2.0
*/
@InjectKey(CodeGenerationComponent.class)
public interface CodeGenerationComponent {
/**
* Puts a new {@code TranslatorConstructor} for the given class/key pair. If
* an old TranslatorConstructor exists for the same class/key pair, it is
* replaced.
*
* @param <DOC> type of Document
* @param <T> type of codegen model
* @param docType class of the Document
* @param tKey translatorKey to use
* @param constructor to use when producing Translators of the specified
* type
*/
default <DOC extends HasName & HasMainInterface, T extends ClassOrInterface<T>> void
put(Class<DOC> docType, TranslatorKey<DOC, T> tKey, TranslatorConstructor<DOC, T> constructor) {
put(docType, tKey.getTranslatedType(), tKey.getKey(), constructor);
}
/**
* Puts a new {@code TranslatorConstructor} for the given class/key pair. If
* an old TranslatorConstructor exists for the same class/key pair, it is
* replaced.
*
* @param <DOC> type of Document
* @param <T> type of codegen model
* @param docType class of the Document
* @param modelType class of the codegen model
* @param key key to use
* @param constructor to use when producing Translators of the specified
* type
*/
<DOC extends HasName & HasMainInterface, T extends ClassOrInterface<T>> void
put(Class<DOC> docType, Class<T> modelType, String key, TranslatorConstructor<DOC, T> constructor);
/**
* Adds a new {@code TranslatorDecorator} for the given class/key pair.
*
* @param <DOC> type of Document
* @param <T> type of codegen model
* @param docType class of the Document
* @param tKey translatorKey to use
* @param decorator the new decorator
*/
default <DOC extends HasName & HasMainInterface, T extends ClassOrInterface<T>> void
add(Class<DOC> docType, TranslatorKey<DOC, T> tKey, TranslatorDecorator<DOC, T> decorator) {
add(docType, tKey.getTranslatedType(), tKey.getKey(), decorator);
}
/**
* Adds a new {@code TranslatorDecorator} for the given class/key pair.
*
* @param <DOC> type of Document
* @param <T> type of codegen model
* @param docType class of the Document
* @param modelType class of the codegen mdoel
* @param key key to use
* @param decorator the new decorator
*/
<DOC extends HasName & HasMainInterface, T extends ClassOrInterface<T>> void
add(Class<DOC> docType, Class<T> modelType, String key, TranslatorDecorator<DOC, T> decorator);
/**
* Removes the {@code TranslatorConstructor} for the given class/key pair.
*
* @param <DOC> type of Document
* @param <T> type of codegen model
* @param docType class of the Document
* @param tKey translatorKey to use
*/
default <DOC extends HasName & HasMainInterface, T extends ClassOrInterface<T>> void
remove(Class<DOC> docType, TranslatorKey<DOC, T> tKey) {
remove(docType, tKey.getKey());
}
/**
* Removes the {@code TranslatorConstructor} for the given class/key pair.
*
* @param <DOC> type of Document
* @param <T> type of codegen model
* @param docType class of the Document
* @param key key to use
*/
<DOC extends HasName & HasMainInterface, T extends ClassOrInterface<T>> void
remove(Class<DOC> docType, String key);
/**
* Returns a Stream of newly created {@code Translator Translators} for the
* given Document. The translators are all created regardless of its
* registered key.
*
* @param <DOC> Document type
* @param document to use when making translators
* @return a Stream of newly created {@code Translator Translators}
* for the given Document
*/
<DOC extends HasName & HasMainInterface> Stream<? extends Translator<DOC, ?>>
translators(DOC document);
/**
* Returns a Stream of newly created {@code Translator Translators} for the
* given Document and key. Only Translators that match the provided key are
* included in the Stream.
*
* @param <DOC> document type
* @param <T> codegen model type
* @param document to use when making translators
* @param key the key
* @return a Stream of newly created {@code Translator Translators}
* for the given Document
*
* @throws SpeedmentTranslatorException if the specified translator did not
* exist
*/
default <DOC extends HasName & HasMainInterface, T extends ClassOrInterface<T>> Translator<DOC, T>
findTranslator(DOC document, TranslatorKey<DOC, T> key) throws SpeedmentTranslatorException {
return CodeGenerationComponent.this.findTranslator(document, key.getTranslatedType(), key.getKey());
}
/**
* Returns a Stream of newly created {@code Translator Translators} for the
* given Document and key. Only Translators that match the provided key are
* included in the Stream.
*
* @param <DOC> document type
* @param <T> codegen model type
* @param document to use when making translators
* @param modelType type to indicate return type variables
* @param key the key
* @return the newly created {@code Translator Translators} for the
* given Document
*
* @throws SpeedmentTranslatorException if the specified translator did not
* exist
*/
<DOC extends HasName & HasMainInterface, T extends ClassOrInterface<T>> Translator<DOC, T>
findTranslator(DOC document, Class<T> modelType, String key) throws SpeedmentTranslatorException;
/**
* Returns a stream over the currently installed translator keys.
*
* @return stream of translator keys
*/
Stream<String> translatorKeys();
}