2
2
# pylint doesn't recognize abstract methods
3
3
import logging
4
4
import shutil
5
+ import xml .etree .ElementTree as ET # nosec
5
6
from collections import namedtuple
7
+ from xml .etree .ElementTree import ParseError # nosec
6
8
7
9
from rpdk .core .data_loaders import resource_stream
8
10
from rpdk .core .exceptions import InternalError , SysExitRecommendedError
@@ -37,10 +39,29 @@ def wrapper(*args, **kwargs):
37
39
return wrapper
38
40
39
41
42
+ DEFAULT_PROTOCOL_VERSION = "2.0.0"
43
+ PROTOCOL_VERSION_SETTING = "protocolVersion"
44
+ DEFAULT_SETTINGS = {PROTOCOL_VERSION_SETTING : DEFAULT_PROTOCOL_VERSION }
45
+
46
+ MINIMUM_JAVA_DEPENDENCY_VERSION = "2.0.0"
47
+
48
+
40
49
class JavaArchiveNotFoundError (SysExitRecommendedError ):
41
50
pass
42
51
43
52
53
+ class JavaPluginVersionNotSupportedError (SysExitRecommendedError ):
54
+ pass
55
+
56
+
57
+ class JavaPluginNotFoundError (SysExitRecommendedError ):
58
+ pass
59
+
60
+
61
+ class InvalidMavenPOMError (SysExitRecommendedError ):
62
+ pass
63
+
64
+
44
65
class JavaLanguagePlugin (LanguagePlugin ):
45
66
MODULE_NAME = __name__
46
67
RUNTIME = "java8"
@@ -66,7 +87,7 @@ def _namespace_from_project(self, project):
66
87
fallback = ("com" ,) + project .type_info
67
88
namespace = tuple (safe_reserved (s .lower ()) for s in fallback )
68
89
self .namespace = project .settings ["namespace" ] = namespace
69
- project ._write_settings ( "java" ) # pylint: disable=protected-access
90
+ project .write_settings ()
70
91
71
92
self .package_name = "." .join (self .namespace )
72
93
@@ -283,6 +304,7 @@ def _init_settings(self, project):
283
304
project .runtime = self .RUNTIME
284
305
project .entrypoint = self .ENTRY_POINT .format (self .package_name )
285
306
project .test_entrypoint = self .TEST_ENTRY_POINT .format (self .package_name )
307
+ project .settings .update (DEFAULT_SETTINGS )
286
308
287
309
@staticmethod
288
310
def _get_generated_root (project ):
@@ -377,6 +399,24 @@ def generate(self, project):
377
399
)
378
400
project .overwrite (path , contents )
379
401
402
+ # Update settings
403
+ java_plugin_dependency_version = self ._get_java_plugin_dependency_version (
404
+ project
405
+ )
406
+ if java_plugin_dependency_version < MINIMUM_JAVA_DEPENDENCY_VERSION :
407
+ raise JavaPluginVersionNotSupportedError (
408
+ "'aws-cloudformation-rpdk-java-plugin' {} is no longer supported."
409
+ "Please update it in pom.xml to version {} or above." .format (
410
+ java_plugin_dependency_version , MINIMUM_JAVA_DEPENDENCY_VERSION
411
+ )
412
+ )
413
+ protocol_version = project .settings .get (PROTOCOL_VERSION_SETTING )
414
+ if protocol_version != DEFAULT_PROTOCOL_VERSION :
415
+ project .settings [PROTOCOL_VERSION_SETTING ] = DEFAULT_PROTOCOL_VERSION
416
+ project .write_settings ()
417
+
418
+ LOG .debug ("Generate complete" )
419
+
380
420
@staticmethod
381
421
def _find_jar (project ):
382
422
jar_glob = list (
@@ -399,6 +439,26 @@ def _find_jar(project):
399
439
400
440
return jar_glob [0 ]
401
441
442
+ @staticmethod
443
+ def _get_java_plugin_dependency_version (project ):
444
+ try :
445
+ tree = ET .parse (project .root / "pom.xml" )
446
+ root = tree .getroot ()
447
+ namespace = {"mvn" : "http://maven.apache.org/POM/4.0.0" }
448
+ plugin_dependency_version = root .find (
449
+ "./mvn:dependencies/mvn:dependency"
450
+ "/[mvn:artifactId='aws-cloudformation-rpdk-java-plugin']/mvn:version" ,
451
+ namespace ,
452
+ )
453
+ if plugin_dependency_version is None :
454
+ raise JavaPluginNotFoundError (
455
+ "'aws-cloudformation-rpdk-java-plugin' maven dependency "
456
+ "not found in pom.xml."
457
+ )
458
+ return plugin_dependency_version .text
459
+ except ParseError :
460
+ raise InvalidMavenPOMError ("pom.xml is invalid." )
461
+
402
462
@logdebug
403
463
def package (self , project , zip_file ):
404
464
"""Packaging Java project"""
0 commit comments