package org.jfrog.hudson.util.converters;
import com.google.common.collect.Lists;
import com.thoughtworks.xstream.converters.UnmarshallingContext;
import hudson.util.XStream2;
import org.apache.commons.lang.StringUtils;
import org.jfrog.hudson.ArtifactoryServer;
import org.jfrog.hudson.CredentialsConfig;
import org.jfrog.hudson.util.Credentials;
import java.io.IOException;
import java.lang.reflect.Field;
import java.util.List;
import java.util.logging.Logger;
/**
* @author Lior Hasson
*/
public class ArtifactoryServerConverter extends XStream2.PassthruConverter<ArtifactoryServer> {
Logger logger = Logger.getLogger(ArtifactoryServerConverter.class.getName());
List<String> converterErrors = Lists.newArrayList();
public ArtifactoryServerConverter(XStream2 xstream) {
super(xstream);
}
@Override
protected void callback(ArtifactoryServer server, UnmarshallingContext context) {
credentialsMigration(server);
if (!converterErrors.isEmpty()) {
logger.info(converterErrors.toString());
}
}
private void credentialsMigration(ArtifactoryServer server) {
try {
deployerMigration(server);
resolverMigration(server);
} catch (NoSuchFieldException e) {
converterErrors.add(getConversionErrorMessage(server, e));
} catch (IllegalAccessException e) {
converterErrors.add(getConversionErrorMessage(server, e));
} catch (IOException e) {
converterErrors.add(getConversionErrorMessage(server, e));
}
}
private void deployerMigration(ArtifactoryServer server) throws NoSuchFieldException, IllegalAccessException, IOException {
Class<? extends ArtifactoryServer> overriderClass = server.getClass();
Field deployerCredentialsField = overriderClass.getDeclaredField("deployerCredentials");
deployerCredentialsField.setAccessible(true);
Object deployerCredentials = deployerCredentialsField.get(server);
Field deployerCredentialsConfigField = overriderClass.getDeclaredField("deployerCredentialsConfig");
deployerCredentialsConfigField.setAccessible(true);
if (deployerCredentials != null) {
deployerCredentialsConfigField.set(server, new CredentialsConfig((Credentials) deployerCredentials, StringUtils.EMPTY, true));
} else {
if (deployerCredentialsConfigField.get(server) == null) {
deployerCredentialsConfigField.set(server, CredentialsConfig.EMPTY_CREDENTIALS_CONFIG);
}
}
}
private void resolverMigration(ArtifactoryServer server)
throws NoSuchFieldException, IllegalAccessException, IOException {
Class<? extends ArtifactoryServer> overriderClass = server.getClass();
Field resolverCredentialsField = overriderClass.getDeclaredField("resolverCredentials");
Field resolverCredentialsConfig = overriderClass.getDeclaredField("resolverCredentialsConfig");
resolverCredentialsConfig.setAccessible(true);
resolverCredentialsField.setAccessible(true);
Object resolverCredentials = resolverCredentialsField.get(server);
if (resolverCredentials != null) {
resolverCredentialsConfig.set(server, new CredentialsConfig((Credentials) resolverCredentials, StringUtils.EMPTY, true));
} else {
if (resolverCredentialsConfig.get(server) == null) {
resolverCredentialsConfig.set(server, CredentialsConfig.EMPTY_CREDENTIALS_CONFIG);
}
}
}
private String getConversionErrorMessage(ArtifactoryServer artifactoryServer, Exception e) {
return String.format("Could not convert the class '%s' to use the new overriding" +
"format. Cause: %s", artifactoryServer.getClass().getName(), e.getCause());
}
}