2121import com .microsoft .azuretools .telemetrywrapper .EventUtil ;
2222import com .microsoft .intellij .AzureLinkStorage ;
2323import com .microsoft .intellij .AzureMySQLStorage ;
24+ import com .microsoft .intellij .util .PluginUtil ;
2425import org .apache .commons .codec .digest .DigestUtils ;
2526import org .apache .commons .collections4 .CollectionUtils ;
2627import org .apache .commons .lang3 .ArrayUtils ;
3233
3334public class AzureLinkService {
3435 private static final AzureLinkService instance = new AzureLinkService ();
36+ private static final int ACCESS_DENIED_ERROR_CODE = 1045 ;
3537
3638 public static AzureLinkService getInstance () {
3739 return instance ;
@@ -42,18 +44,18 @@ private AzureLinkService() {
4244 }
4345
4446 public void link (Project project , LinkConfig <MySQLResourceConfig , ModuleResourceConfig > linkComposite , boolean storageResource ) {
45- ModulePO modulePO = createModulePO (linkComposite .getModule ());
47+ final ModulePO modulePO = createModulePO (linkComposite .getModule ());
4648 // create resource
47- MySQLResourcePO resource = createResourcePO (linkComposite .getResource ());
49+ final MySQLResourcePO resource = createResourcePO (linkComposite .getResource ());
4850 // create link
49- LinkPO linkPO = new LinkPO (resource .getId (), modulePO .getResourceId (), LinkType .SERVICE_WITH_MODULE , linkComposite .getEnvPrefix ());
51+ final LinkPO linkPO = new LinkPO (resource .getId (), modulePO .getResourceId (), LinkType .SERVICE_WITH_MODULE , linkComposite .getEnvPrefix ());
5052 // storage mysql
5153 if (storageResource ) {
5254 AzureMySQLStorage .getStorage ().addResource (resource );
5355 }
5456 // storage password
5557 if (ArrayUtils .isNotEmpty (linkComposite .getResource ().getPasswordConfig ().getPassword ())) {
56- String inputPassword = String .valueOf (linkComposite .getResource ().getPasswordConfig ().getPassword ());
58+ final String inputPassword = String .valueOf (linkComposite .getResource ().getPasswordConfig ().getPassword ());
5759 AzureMySQLStorage .getStorage ().savePassword (resource , resource .getPasswordSave (), resource .getUsername (), inputPassword );
5860 }
5961 // storage link
@@ -65,40 +67,39 @@ private ModulePO createModulePO(ModuleResourceConfig config) {
6567 }
6668
6769 private MySQLResourcePO createResourcePO (MySQLResourceConfig config ) {
68- JdbcUrl jdbcUrl = JdbcUrl .from (config .getUrl ());
69- String businessUniqueKey = MySQLResourcePO .getBusinessUniqueKey (config .getServer ().id (), jdbcUrl .getDatabase ());
70- MySQLResourcePO existedResourcePO = AzureMySQLStorage .getStorage ().getResourceByBusinessUniqueKey (businessUniqueKey );
71- String id = Objects .nonNull (existedResourcePO ) ? existedResourcePO .getId () : DigestUtils .md5Hex (businessUniqueKey );
72- MySQLResourcePO resourcePO = MySQLResourcePO .builder ()
70+ final JdbcUrl jdbcUrl = JdbcUrl .from (config .getUrl ());
71+ final String businessUniqueKey = MySQLResourcePO .getBusinessUniqueKey (config .getServer ().id (), jdbcUrl .getDatabase ());
72+ final MySQLResourcePO existedResourcePO = AzureMySQLStorage .getStorage ().getResourceByBusinessUniqueKey (businessUniqueKey );
73+ final String id = Objects .nonNull (existedResourcePO ) ? existedResourcePO .getId () : DigestUtils .md5Hex (businessUniqueKey );
74+ return MySQLResourcePO .builder ()
7375 .id (id )
7476 .resourceId (config .getServer ().id ())
7577 .url (config .getUrl ())
7678 .username (config .getUsername ())
7779 .passwordSave (config .getPasswordConfig ().getPasswordSaveType ())
7880 .build ();
79- return resourcePO ;
8081 }
8182
8283 public Map <String , String > retrieveLinkEnvsByModuleName (Project project , String moduleName ) {
83- Map <String , String > linkedEnvMap = new LinkedHashMap <>();
84- List <LinkPO > moduleRelatedLinkList = AzureLinkStorage .getProjectStorage (project ).getLinkByModuleId (moduleName )
84+ final Map <String , String > linkedEnvMap = new LinkedHashMap <>();
85+ final List <LinkPO > moduleRelatedLinkList = AzureLinkStorage .getProjectStorage (project ).getLinkByModuleId (moduleName )
8586 .stream ()
8687 .filter (e -> LinkType .SERVICE_WITH_MODULE .equals (e .getType ()))
8788 .collect (Collectors .toList ());
8889 if (CollectionUtils .isEmpty (moduleRelatedLinkList )) {
8990 return linkedEnvMap ;
9091 }
9192 // services in application level
92- Set <? extends BaseResourcePO > serviceSet = AzureMySQLStorage .getStorage ().getResources ();
93- for (BaseResourcePO service : serviceSet ) {
94- for (LinkPO link : moduleRelatedLinkList ) {
93+ final Set <? extends BaseResourcePO > serviceSet = AzureMySQLStorage .getStorage ().getResources ();
94+ for (final BaseResourcePO service : serviceSet ) {
95+ for (final LinkPO link : moduleRelatedLinkList ) {
9596 if (!StringUtils .equals (link .getResourceId (), service .getId ())) {
9697 continue ;
9798 }
98- String envPrefix = link .getEnvPrefix ();
99+ final String envPrefix = link .getEnvPrefix ();
99100 if (ResourceType .AZURE_DATABASE_FOR_MYSQL .equals (service .getType ())) {
100- MySQLResourcePO mysql = (MySQLResourcePO ) service ;
101- String password = readPasswordCredentials (project , mysql );
101+ final MySQLResourcePO mysql = (MySQLResourcePO ) service ;
102+ final String password = readPasswordCredentials (project , mysql );
102103 linkedEnvMap .put (envPrefix + "URL" , mysql .getUrl ());
103104 linkedEnvMap .put (envPrefix + "USERNAME" , mysql .getUsername ());
104105 linkedEnvMap .put (envPrefix + "PASSWORD" , password );
@@ -109,19 +110,24 @@ public Map<String, String> retrieveLinkEnvsByModuleName(Project project, String
109110 }
110111
111112 private String readPasswordCredentials (Project project , MySQLResourcePO service ) {
112- String storagedPassword = AzureMySQLStorage .getStorage ().loadPassword (service , service .getPasswordSave (), service .getUsername ());
113- if (StringUtils .isNotBlank (storagedPassword )) {
114- if (MySQLConnectionUtils .connect (service .getUrl (), service .getUsername (), storagedPassword )) {
115- return storagedPassword ;
113+ final String storedPassword = AzureMySQLStorage .getStorage ().loadPassword (service , service .getPasswordSave (), service .getUsername ());
114+ if (StringUtils .isNotEmpty (storedPassword )) {
115+ final MySQLConnectionUtils .ConnectResult result = MySQLConnectionUtils .connectWithPing (service .getUrl (), service .getUsername (), storedPassword );
116+ if (result .isConnected ()) {
117+ return storedPassword ;
118+ }
119+ if (result .getErrorCode () != ACCESS_DENIED_ERROR_CODE ) {
120+ PluginUtil .showWarnNotification ("Failed to connect MySQL" , result .getMessage ());
121+ return StringUtils .EMPTY ;
116122 }
117123 }
118124 // re-input password
119- AtomicReference <PasswordConfig > passwordConfigReference = new AtomicReference <>();
125+ final AtomicReference <PasswordConfig > passwordConfigReference = new AtomicReference <>();
120126 ApplicationManager .getApplication ().invokeAndWait (() -> {
121- PasswordDialog dialog = new PasswordDialog (project , service .getUsername (), service .getUrl ());
127+ final PasswordDialog dialog = new PasswordDialog (project , service .getUsername (), service .getUrl ());
122128 dialog .setOkActionListener (data -> {
123129 dialog .close ();
124- String inputPassword = String .valueOf (data .getPassword ());
130+ final String inputPassword = String .valueOf (data .getPassword ());
125131 if (MySQLConnectionUtils .connect (service .getUrl (), service .getUsername (), inputPassword )) {
126132 AzureMySQLStorage .getStorage ().savePassword (service , data .getPasswordSaveType (), service .getUsername (), inputPassword );
127133 if (!Objects .equals (service .getPasswordSave (), data .getPasswordSaveType ())) {
@@ -134,7 +140,7 @@ private String readPasswordCredentials(Project project, MySQLResourcePO service)
134140 EventUtil .logEvent (EventType .info , ActionConstants .parse (ActionConstants .MySQL .UPDATE_PASSWORD ).getServiceName (),
135141 ActionConstants .parse (ActionConstants .MySQL .UPDATE_PASSWORD ).getOperationName (), null );
136142 });
137- PasswordConfig passwordConfig = passwordConfigReference .get ();
143+ final PasswordConfig passwordConfig = passwordConfigReference .get ();
138144 if (Objects .nonNull (passwordConfig )) {
139145 return String .valueOf (passwordConfig .getPassword ());
140146 } else {
0 commit comments