/*
 * Licensed to the Apache Software Foundation (ASF) under one or more
 * contributor license agreements.  See the NOTICE file distributed with
 * this work for additional information regarding copyright ownership.
 * The ASF licenses this file to You 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.
 */

import {JavaTypesNonEnum} from './JavaTypesNonEnum.service';
import IgniteClusterDefaults from './generator/defaults/Cluster.service';
import IgniteClusterPlatformDefaults from './generator/defaults/Cluster.platform.service';
import IgniteCacheDefaults from './generator/defaults/Cache.service';
import IgniteCachePlatformDefaults from './generator/defaults/Cache.platform.service';
import IgniteIGFSDefaults from './generator/defaults/IGFS.service';
import IgniteEventGroups from './generator/defaults/Event-groups.service';

import IgniteConfigurationGenerator from './generator/ConfigurationGenerator';
import IgnitePlatformGenerator from './generator/PlatformGenerator';

import IgniteSpringTransformer from './generator/SpringTransformer.service';
import IgniteJavaTransformer from './generator/JavaTransformer.service';
import SharpTransformer from './generator/SharpTransformer.service';
import IgniteDockerGenerator from './generator/Docker.service';
import IgniteMavenGenerator from './generator/Maven.service';
import IgniteGeneratorProperties from './generator/Properties.service';
import IgniteReadmeGenerator from './generator/Readme.service';
import IgniteCustomGenerator from './generator/Custom.service';
import IgniteArtifactVersionUtils from './generator/ArtifactVersionChecker.service';


// Ignite events groups.
export default angular
    .module('ignite-console.configuration.generator', [])
    .service('JavaTypesNonEnum', JavaTypesNonEnum)
    .service('IgniteConfigurationGenerator', function() { return IgniteConfigurationGenerator;})
    .service('IgnitePlatformGenerator', IgnitePlatformGenerator)
    .service('SpringTransformer', function() { return IgniteSpringTransformer;})
    .service('JavaTransformer', function() { return IgniteJavaTransformer;})
    .service('IgniteSharpTransformer', SharpTransformer)
    .service('IgniteEventGroups', IgniteEventGroups)
    .service('IgniteClusterDefaults', IgniteClusterDefaults)
    .service('IgniteClusterPlatformDefaults', IgniteClusterPlatformDefaults)
    .service('IgniteCacheDefaults', IgniteCacheDefaults)
    .service('IgniteCachePlatformDefaults', IgniteCachePlatformDefaults)
    .service('IgniteIGFSDefaults', IgniteIGFSDefaults)
    .service('IgnitePropertiesGenerator', IgniteGeneratorProperties)
    .service('IgniteReadmeGenerator', IgniteReadmeGenerator)
    .service('IgniteDockerGenerator', IgniteDockerGenerator)
    .service('IgniteMavenGenerator', IgniteMavenGenerator)
    .service('IgniteCustomGenerator', IgniteCustomGenerator)
    .service('IgniteArtifactVersionUtils', IgniteArtifactVersionUtils);
