Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

#175 fixed #242

Closed
wants to merge 11 commits into from
Original file line number Diff line number Diff line change
Expand Up @@ -15,7 +15,7 @@ import com.btc.serviceidl.generator.common.PackageInfo
import com.btc.serviceidl.generator.common.ProjectType
import com.btc.serviceidl.generator.cpp.CppConstants
import com.btc.serviceidl.generator.cpp.ServiceCommVersion
import com.btc.serviceidl.generator.cpp.cab.CABModuleStructureStrategy
import com.btc.serviceidl.generator.cpp.cmake.CMakeModuleStructureStrategy
import com.btc.serviceidl.generator.cpp.cmake.CMakeProjectSetFactory
import com.btc.serviceidl.generator.cpp.prins.PrinsModuleStructureStrategy
import com.btc.serviceidl.generator.cpp.prins.VSSolutionFactory
Expand Down Expand Up @@ -211,13 +211,7 @@ class DefaultGenerationSettingsProvider implements IGenerationSettingsProvider
case Main.OPTION_VALUE_CPP_PROJECT_SYSTEM_CMAKE:
{
result.projectSetFactory = new CMakeProjectSetFactory();

// TODO instead of printing on System.out, use some event mechanism here
System.out.println("Disabling ODB generation, this is unsupported with CMake project system");
result.projectTypes = Sets.difference(result.projectTypes,
ImmutableSet.of(ProjectType.EXTERNAL_DB_IMPL));
result.moduleStructureStrategy = new CABModuleStructureStrategy();

result.moduleStructureStrategy = new CMakeModuleStructureStrategy();
}
case Main.OPTION_VALUE_CPP_PROJECT_SYSTEM_PRINS_VCXPROJ:
{
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -15,8 +15,6 @@
*/
package com.btc.serviceidl.generator.cpp

import com.btc.serviceidl.generator.common.GeneratorUtil
import com.btc.serviceidl.generator.common.TransformType
import com.btc.serviceidl.generator.cpp.TypeResolver.IncludeGroup
import java.util.ArrayList
import java.util.Arrays
Expand Down Expand Up @@ -196,6 +194,14 @@ class HeaderResolver
"boost::bimap" -> "boost/bimap.hpp"
}

// ******************************* PLEASE ALWAYS KEEP THIS LIST ALPHABETICALLY SORTED !!! ******************************* //
static val odbHeaderMapper = #{
"id_binary" -> "odb/mssql/traits.hxx",
"id_raw" -> "odb/oracle/traits.hxx",
"id_uniqueidentifier" -> "odb/mssql/traits.hxx",
"odb::nullable" -> "odb/nullable.hxx"
}

val Map<String, GroupedHeader> headerMap
val Map<String, GroupedHeader> implementationHeaderMap

Expand Down Expand Up @@ -253,7 +259,7 @@ class HeaderResolver
{
builder.withGroup(stlHeaderMapper, TypeResolver.STL_INCLUDE_GROUP).withGroup(boostHeaderMapper,
TypeResolver.BOOST_INCLUDE_GROUP).withGroup(cabHeaderMapper, TypeResolver.CAB_INCLUDE_GROUP).
withImplementationGroup(cabImplHeaderMapper, TypeResolver.CAB_INCLUDE_GROUP)
withImplementationGroup(cabImplHeaderMapper, TypeResolver.CAB_INCLUDE_GROUP).withGroup(odbHeaderMapper, TypeResolver.ODB_INCLUDE_GROUP)
}

def configureGroup(Iterable<TypeResolver.IncludeGroup> includeGroups, int precedence, String prefix,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -99,7 +99,8 @@ class TypeResolver
public static val STL_INCLUDE_GROUP = new IncludeGroup("STL")
public static val BOOST_INCLUDE_GROUP = new IncludeGroup("boost")
public static val CAB_INCLUDE_GROUP = new IncludeGroup("BTC.CAB")

public static val ODB_INCLUDE_GROUP = new IncludeGroup("odb")
yury-trofimov marked this conversation as resolved.
Show resolved Hide resolved

val LibResolver libResolver
@Accessors(PACKAGE_GETTER) val HeaderResolver headerResolver

Expand Down Expand Up @@ -154,6 +155,10 @@ class TypeResolver
// do nothing
{
}
case ODB_INCLUDE_GROUP:
// do nothing
{
}
case PrinsHeaderResolver.ODB_INCLUDE_GROUP:
// TODO remove this here, make a subclass in prins.* or so
// do nothing
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,59 @@
/*********************************************************************
* \author see AUTHORS file
* \copyright 2015-2018 BTC Business Technology Consulting AG and others
*
* 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
**********************************************************************/
package com.btc.serviceidl.generator.cpp.cmake

import com.btc.serviceidl.generator.common.ArtifactNature
import com.btc.serviceidl.generator.common.GeneratorUtil
import com.btc.serviceidl.generator.common.ParameterBundle
import com.btc.serviceidl.generator.common.ProjectType
import com.btc.serviceidl.generator.cpp.HeaderResolver
import com.btc.serviceidl.generator.cpp.HeaderType
import com.btc.serviceidl.generator.cpp.IModuleStructureStrategy
import com.btc.serviceidl.generator.cpp.TypeResolver
import com.btc.serviceidl.idl.ModuleDeclaration
import org.eclipse.core.runtime.Path

import static extension com.btc.serviceidl.generator.cpp.HeaderResolver.Builder.*
import static extension com.btc.serviceidl.generator.cpp.Util.*

class CMakeModuleStructureStrategy implements IModuleStructureStrategy
{

override getIncludeFilePath(Iterable<ModuleDeclaration> moduleStack, ProjectType projectType, String baseName,
HeaderType headerType)
{
getProjectDir(new ParameterBundle(moduleStack, projectType)).append(headerType.includeDirectoryName).append(
baseName).addFileExtension(headerType.fileExtension)
}

override getEncapsulationHeaders()
{
new Pair("// ODB", "")
sigiesec marked this conversation as resolved.
Show resolved Hide resolved
}

override createHeaderResolver()
{
new HeaderResolver.Builder().withBasicGroups.configureGroup(TypeResolver.TARGET_INCLUDE_GROUP, 10, "", "",
false).configureGroup(TypeResolver.ODB_INCLUDE_GROUP, 20, "", "", true).configureGroup(
TypeResolver.STL_INCLUDE_GROUP, 30, "", "", true).configureGroup(
TypeResolver.CAB_INCLUDE_GROUP, 40, "", "", true).build
sigiesec marked this conversation as resolved.
Show resolved Hide resolved
}

override getProjectDir(ParameterBundle paramBundle)
{
GeneratorUtil.asPath(paramBundle, ArtifactNature.CPP)
}

override getSourceFileDir()
{
Path.fromPortableString("src")
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -8,13 +8,18 @@ import com.btc.serviceidl.generator.common.ProjectType
import com.btc.serviceidl.generator.cpp.CppConstants
import com.btc.serviceidl.generator.cpp.IProjectSet
import com.btc.serviceidl.generator.cpp.ServiceCommVersion
import com.btc.serviceidl.idl.AbstractTypeReference
import com.btc.serviceidl.idl.IDLSpecification
import com.btc.serviceidl.idl.ModuleDeclaration
import com.btc.serviceidl.idl.StructDeclaration
import com.btc.serviceidl.util.Util
import java.util.HashSet
import org.eclipse.core.runtime.Path
import org.eclipse.xtend.lib.annotations.Accessors
import org.eclipse.xtext.generator.IFileSystemAccess

import static extension com.btc.serviceidl.generator.common.GeneratorUtil.*
import static extension com.btc.serviceidl.generator.cpp.CppExtensions.*
import static extension com.btc.serviceidl.util.Util.*

@Accessors(NONE)
Expand Down Expand Up @@ -85,6 +90,11 @@ class CMakeTopLevelProjectFileGenerator
val versionSuffix = if (generationSettings.maturity == Maturity.SNAPSHOT) "-unreleased" else ""
val dependencyChannel = if (generationSettings.maturity == Maturity.SNAPSHOT) "testing" else "stable"

// TODO the ODB data could be parameterized in the future
val odbTargetVersion = "2.5.0-b.9"
val libodbTargetVersion = "2.5.0-b.9"
val odbdependencyChannel = "extern"

// TODO the transitive dependencies do not need to be specified here
'''
from conan_template import *
Expand Down Expand Up @@ -115,10 +125,34 @@ class CMakeTopLevelProjectFileGenerator
«FOR dependency : generationSettings.dependencies.sortBy[getID(ArtifactNature.CPP)]»
("«dependency.getID(ArtifactNature.CPP)»/«dependency.version»«versionSuffix»@cab/«dependencyChannel»"),
«ENDFOR»
«IF projectSet.projects.exists[it.projectType == ProjectType.EXTERNAL_DB_IMPL]»
("odb/«odbTargetVersion»@cab/«odbdependencyChannel»"),
sigiesec marked this conversation as resolved.
Show resolved Hide resolved
("libodb/«libodbTargetVersion»@cab/«odbdependencyChannel»")
«ENDIF»
)
generators = "cmake"
short_paths = True

def generateODBFiles(self):
includedirs = ""
for includedir in self.deps_cpp_info["BTC.CAB.Commons"].includedirs:
includedirs += " -I " + os.path.normpath(os.path.join(includedir))
for includedir in self.deps_cpp_info["odb"].includedirs:
includedirs += " -I " + os.path.normpath(os.path.join(includedir))
for includedir in self.deps_cpp_info["libodb"].includedirs:
includedirs += " -I " + os.path.normpath(os.path.join(includedir))
odbdir = ""
«FOR project : projectSet.projects»
«IF project.projectType == ProjectType.EXTERNAL_DB_IMPL»
odbdir = os.path.normpath(self.source_folder + "\\«project.relativePath»\\odb")
«ENDIF»
«ENDFOR»
odbbindir = os.path.normpath(os.path.join(self.deps_cpp_info["odb"].bindirs[0]))
«FOR struct : ODBStructsList»
self.run(odbbindir + '\\odb.exe --std c++11' + includedirs +
' --multi-database dynamic --database common --database mssql --database oracle --generate-query --generate-prepared --generate-schema --schema-format embedded -x -Wno-unknown-pragmas -x -Wno-pragmas -x -Wno-literal-suffix -x -Wno-attributes --hxx-prologue "#include \"traits.hxx\"" --output-dir ' + odbdir + ' ' + odbdir + '\\«struct».hxx')
«ENDFOR»

def generateProtoFiles(self):
protofiles = glob.glob(self.source_folder + "/**/gen/*.proto", recursive=True)
outdir = self.source_folder
Expand All @@ -131,12 +165,15 @@ class CMakeTopLevelProjectFileGenerator

def build(self):
self.generateProtoFiles()
«IF projectSet.projects.exists[it.projectType == ProjectType.EXTERNAL_DB_IMPL]»
self.generateODBFiles()
«ENDIF»
ConanTemplate.build(self)

def package(self):
ConanTemplate.package(self)
self.copy("**/*.proto", dst="proto", keep_path=True)

def imports(self):
self.copy("protoc.exe", "bin", "bin")
'''
Expand Down Expand Up @@ -250,4 +287,30 @@ class CMakeTopLevelProjectFileGenerator
generationSettings.moduleStructureStrategy.getProjectDir(paramBundle).makeRelativeTo(modulePath)
}

/**
get the list of the names for all ODB structures
*/
private def HashSet<String> getODBStructsList()
sigiesec marked this conversation as resolved.
Show resolved Hide resolved
{
val odbStructNames = new HashSet<String>

projectSet.projects.filter[it.projectType == ProjectType.EXTERNAL_DB_IMPL].forEach
[
it.moduleStack.forEach
[
it.moduleComponents
sigiesec marked this conversation as resolved.
Show resolved Hide resolved
.filter[e | e.isStruct]
.map(e | e.structType.ultimateType as StructDeclaration)
.filter[!members.empty]
.filter[!members.filter[m | m.name.toUpperCase == "ID" && Util.isUUIDType(m.type)].empty]
.map[val AbstractTypeReference res = it ; res]
.resolveAllDependencies
.map[type]
.filter(StructDeclaration)
.filter[!members.filter[m | m.name.toUpperCase == "ID" && Util.isUUIDType(m.type)].empty].forEach[odbStructNames.add (it.name.toLowerCase)]
sigiesec marked this conversation as resolved.
Show resolved Hide resolved
]
]

return odbStructNames
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,7 @@
**********************************************************************/
package com.btc.serviceidl.generator.cpp.prins

import com.btc.serviceidl.generator.DefaultGenerationSettings
import com.btc.serviceidl.generator.ITargetVersionProvider
import com.btc.serviceidl.generator.common.ArtifactNature
import com.btc.serviceidl.generator.common.GeneratorUtil
Expand All @@ -21,6 +22,7 @@ import com.btc.serviceidl.generator.cpp.IProjectSet
import com.btc.serviceidl.generator.cpp.IProjectSetFactory
import com.btc.serviceidl.generator.cpp.ProjectFileSet
import com.btc.serviceidl.generator.cpp.ProjectGeneratorBase
import com.btc.serviceidl.generator.cpp.cmake.CMakeModuleStructureStrategy
import com.btc.serviceidl.idl.AbstractTypeReference
import com.btc.serviceidl.idl.IDLSpecification
import com.btc.serviceidl.idl.InterfaceDeclaration
Expand Down Expand Up @@ -137,14 +139,17 @@ class OdbProjectGenerator extends ProjectGeneratorBase {
{
'''
#pragma once

«IF ! ((basicCppGenerator.targetVersionProvider as DefaultGenerationSettings).getModuleStructureStrategy() instanceof CMakeModuleStructureStrategy)»
yury-trofimov marked this conversation as resolved.
Show resolved Hide resolved
#include "modules/Commons/include/BeginPrinsModulesInclude.h"
«ENDIF»

«IF useCommonTypes»#include "«Constants.FILE_NAME_ODB_COMMON.hxx»"«ENDIF»
«basicCppGenerator.generateIncludes(true)»
«fileContent»

«IF ! ((basicCppGenerator.targetVersionProvider as DefaultGenerationSettings).getModuleStructureStrategy() instanceof CMakeModuleStructureStrategy)»
#include "modules/Commons/include/EndPrinsModulesInclude.h"
«ENDIF»
'''
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -52,6 +52,6 @@ class PrinsModuleStructureStrategy implements IModuleStructureStrategy

override getSourceFileDir()
{
Path.fromPortableString("source")
Path.fromPortableString("src")
}
}