22# pylint doesn't recognize abstract methods
33import logging
44import shutil
5+ import xml .etree .ElementTree as ET # nosec
56from collections import namedtuple
7+ from xml .etree .ElementTree import ParseError # nosec
68
79from rpdk .core .data_loaders import resource_stream
810from rpdk .core .exceptions import InternalError , SysExitRecommendedError
@@ -37,10 +39,29 @@ def wrapper(*args, **kwargs):
3739 return wrapper
3840
3941
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+
4049class JavaArchiveNotFoundError (SysExitRecommendedError ):
4150 pass
4251
4352
53+ class JavaPluginVersionNotSupportedError (SysExitRecommendedError ):
54+ pass
55+
56+
57+ class JavaPluginNotFoundError (SysExitRecommendedError ):
58+ pass
59+
60+
61+ class InvalidMavenPOMError (SysExitRecommendedError ):
62+ pass
63+
64+
4465class JavaLanguagePlugin (LanguagePlugin ):
4566 MODULE_NAME = __name__
4667 RUNTIME = "java8"
@@ -66,7 +87,7 @@ def _namespace_from_project(self, project):
6687 fallback = ("com" ,) + project .type_info
6788 namespace = tuple (safe_reserved (s .lower ()) for s in fallback )
6889 self .namespace = project .settings ["namespace" ] = namespace
69- project ._write_settings ( "java" ) # pylint: disable=protected-access
90+ project .write_settings ()
7091
7192 self .package_name = "." .join (self .namespace )
7293
@@ -283,6 +304,7 @@ def _init_settings(self, project):
283304 project .runtime = self .RUNTIME
284305 project .entrypoint = self .ENTRY_POINT .format (self .package_name )
285306 project .test_entrypoint = self .TEST_ENTRY_POINT .format (self .package_name )
307+ project .settings .update (DEFAULT_SETTINGS )
286308
287309 @staticmethod
288310 def _get_generated_root (project ):
@@ -377,6 +399,24 @@ def generate(self, project):
377399 )
378400 project .overwrite (path , contents )
379401
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+
380420 @staticmethod
381421 def _find_jar (project ):
382422 jar_glob = list (
@@ -399,6 +439,26 @@ def _find_jar(project):
399439
400440 return jar_glob [0 ]
401441
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+
402462 @logdebug
403463 def package (self , project , zip_file ):
404464 """Packaging Java project"""
0 commit comments