How to access PluginSettings from other files and classes
Asked by Johan Jonsson Nilsson:

Hi!

I have followed the tutorial on the following page: <https://developer.atlassian.com/server/framework/atlassian-sdk/creating-an-admin-configuration-form/>

<br />

I have gotten it to save and load the pluginsettings, as long as it's being accessed from the ConfigResource, which you can see below:

```
@Path("/")
public class ConfigResource {

private static final Logger log = LoggerFactory.getLogger(ConfigResource.class);
private static boolean transactionFlag = false;

@ComponentImport
private final UserManager userManager;
@ComponentImport
private final PluginSettingsFactory pluginSettingsFactory;
@ComponentImport
private final TransactionTemplate transactionTemplate;

@Autowired
public ConfigResource(UserManager userManager, PluginSettingsFactory pluginSettingsFactory, TransactionTemplate transactionTemplate) {
this.userManager = userManager;
this.pluginSettingsFactory = pluginSettingsFactory;
this.transactionTemplate = transactionTemplate;
}

@GET
@Produces(MediaType.APPLICATION_JSON)
public Response get(@Context HttpServletRequest request) {
String username = userManager.getRemoteUsername(request);
if (username == null || !userManager.isSystemAdmin(username)) {
return Response.status(Status.UNAUTHORIZED).build();
}

return Response.ok(transactionTemplate.execute(new TransactionCallback() {

public Object doInTransaction() {
PluginSettings settings = pluginSettingsFactory.createGlobalSettings();
Config config = new Config();
config.setHost((String) settings.get(Config.class.getName() + ".host"));

String port = (String) settings.get(Config.class.getName() + ".port");
if (port != null) {
config.setPort(Integer.parseInt(port));
}

config.setEmail((String) settings.get(Config.class.getName() + ".email"));
config.setPassword((String) settings.get(Config.class.getName() + ".password"));
config.setSpacekey((String) settings.get(Config.class.getName() + ".spacekey"));
return config;
}
})).build();
}

@PUT
@Consumes(MediaType.APPLICATION_JSON)
public Response put(final Config config, @Context HttpServletRequest request) {
String username = userManager.getRemoteUsername(request);
if (username == null || !userManager.isSystemAdmin(username)) {
return Response.status(Status.UNAUTHORIZED).build();
}

transactionTemplate.execute(new TransactionCallback() {
public Object doInTransaction() {
PluginSettings pluginSettings = pluginSettingsFactory.createGlobalSettings();
pluginSettings.put(Config.class.getName() + ".host", config.getHost());
pluginSettings.put(Config.class.getName() + ".port", Integer.toString(config.getPort()));
pluginSettings.put(Config.class.getName() + ".email", config.getEmail());
pluginSettings.put(Config.class.getName() + ".password", config.getPassword());
pluginSettings.put(Config.class.getName() + ".spacekey", config.getSpacekey());
return null;
}
});
return Response.noContent().build();
}

@Path("/testconfig")
@POST
@Consumes(MediaType.APPLICATION_JSON)
public Response testConfig(final Config config, @Context HttpServletRequest request) {
transactionFlag = false;
String username = userManager.getRemoteUsername(request);
if (username == null || !userManager.isSystemAdmin(username)) {
return Response.status(Status.UNAUTHORIZED).build();
}

transactionTemplate.execute(new TransactionCallback() {
public Object doInTransaction() {
Properties props = new Properties();
props.put("mail.store.protocol", "imap");
props.put("mail.imap.connectiontimeout", "5000");
props.put("mail.imap.timeout", "5000");
Session session = Session.getDefaultInstance(props, null);
Store store;
try {
store = session.getStore();
} catch (NoSuchProviderException e) {
log.error("ERROR: " + e.getMessage());
return null;
}
try {
store.connect(config.getHost(), config.getPort(), config.getEmail(), config.getPassword());
if (store.isConnected()) {
store.close();
transactionFlag = true;
return null;
} else {
store.close();
return null;
}
} catch (MessagingException e) {
log.error("ERROR: " + e.getMessage());
return null;
}
}
});

return (transactionFlag) ? Response.status(Status.OK).build() : Response.status(Status.NOT_ACCEPTABLE).build();

}

@XmlRootElement
@XmlAccessorType(XmlAccessType.FIELD)
public static final class Config {
@XmlElement private String host;
@XmlElement private int port;
@XmlElement private String email;
@XmlElement private String password;
@XmlElement private String spacekey;

public String getHost() {
return host;
}

public void setHost(String host) {
this.host = host;
}

public int getPort() {
return port;
}

public void setPort(int port) {
this.port = port;
}

public String getEmail() {
return email;
}

public void setEmail(String email) {
this.email = email;
}

public String getPassword() {
return password;
}

public void setPassword(String password) {
this.password = password;
}

public String getSpacekey() {
return spacekey;
}

public void setSpacekey(String spacekey) {
this.spacekey = spacekey;
}

}

}
```

However, I have another Java file called "CheckMail.java", where I would like to use these settings. However I get a null pointer when I try to access these variables. I have tried the following:

```
package net.teliacompany.diva.confluence.parbackend.utilities;

import java.util.Properties;

import javax.inject.Inject;
import javax.inject.Named;
import javax.mail.Folder;
import javax.mail.MessagingException;
import javax.mail.Session;
import javax.mail.Store;

import com.atlassian.plugin.spring.scanner.annotation.imports.ComponentImport;
import com.atlassian.sal.api.pluginsettings.PluginSettings;
import com.atlassian.sal.api.pluginsettings.PluginSettingsFactory;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import net.teliacompany.diva.confluence.parbackend.utilities.ConfigResource.Config;

public class CheckMail {

private static final Logger log = LoggerFactory.getLogger(CheckMail.class);

public CheckMail() {
}

@ComponentImport
private PluginSettingsFactory pluginSettingsFactory;

@Inject
public CheckMail(PluginSettingsFactory pluginSettingsFactory) {
this.pluginSettingsFactory = pluginSettingsFactory;
}

public boolean checkIfThereAnyNewAvailableMails() throws MessagingException {
log.warn("checking mail");
PluginSettings settings = pluginSettingsFactory.createGlobalSettings();
log.warn("Host: " + settings.get(Config.class.getName() + ".host"));
log.warn("Port: " + settings.get(Config.class.getName() + ".port"));
log.warn("Email: " + settings.get(Config.class.getName() + ".email"));
log.warn("Password: " + settings.get(Config.class.getName() + ".password"));
log.warn("spaceKey: " + settings.get(Config.class.getName() + ".spacekey"));
return true;
// log.warn("checking mail");
// Properties props = new Properties();
// props.put("mail.store.protocol", "imap");
// Session session = Session.getDefaultInstance(props, null);
// Store store = session.getStore();
// Folder inbox = store.getFolder("INBOX");
// inbox.open(Folder.READ_ONLY);
// int messageCount = inbox.getMessageCount();
// inbox.close(false);
// store.close();
// return (messageCount > 0) ? true : false;
}
}
```

Does anyone here know how to access PluginSettings from another class/file?

Thanks!


Answers:
author: Aleksandr Zuevich
body: Hi [@Johan Jonsson Nilsson](/t5/user/viewprofilepage/user-id/684377) ,

I suppose you need to mark your CheckMail class with @Component or @Named annotation.

comments: author: Johan Jonsson Nilsson
body: Hey!

Yeah it was probably due to that. It felt like I tried that though.. strange.

In any case, if anyone's interested to see the code and how I solved it for CheckMail.java, please see below:

```
import java.util.Properties;

import javax.mail.Folder;
import javax.mail.MessagingException;
import javax.mail.NoSuchProviderException;
import javax.mail.Session;
import javax.mail.Store;

import com.atlassian.plugin.spring.scanner.annotation.imports.ComponentImport;
import com.atlassian.sal.api.pluginsettings.PluginSettings;
import com.atlassian.sal.api.pluginsettings.PluginSettingsFactory;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;

import net.teliacompany.diva.confluence.parbackend.utilities.ConfigResource.Config;

@Component
public class CheckMail {

private static final Logger log = LoggerFactory.getLogger(CheckMail.class);

@ComponentImport
private static PluginSettingsFactory pluginSettingsFactory;

@Autowired
public CheckMail(PluginSettingsFactory pluginSettingsFactory) {
this.pluginSettingsFactory = pluginSettingsFactory;
}

public static int checkIfThereAnyNewAvailableMails() throws MessagingException {
log.warn("checking mail");
int messageCountToReturn = 0;

PluginSettings settings = pluginSettingsFactory.createGlobalSettings();
String host = (String) settings.get(Config.class.getName() + ".host");
int port = Integer.parseInt((String) settings.get(Config.class.getName() + ".port"));
String user = (String) settings.get(Config.class.getName() + ".email");
String password = (String) settings.get(Config.class.getName() + ".password");

Properties props = new Properties();
props.put("mail.store.protocol", "imap");
props.put("mail.imap.connectiontimeout", "5000");
props.put("mail.imap.timeout", "5000");
Session session = Session.getDefaultInstance(props, null);
Store store;
try {
store = session.getStore();
try {
store.connect(host, port, user, password);
if (store.isConnected()) {
log.warn("We connected!");
Folder inbox = store.getFolder("INBOX");
inbox.open(Folder.READ_ONLY);
log.warn("inbox messages: " + inbox.getMessageCount());
messageCountToReturn = inbox.getMessageCount();
inbox.close(false);
store.close();
return messageCountToReturn;
} else {
store.close();
return messageCountToReturn;
}
} catch (MessagingException e) {
store.close();
log.error("ERROR: " + e.getMessage());
return messageCountToReturn;
}
} catch (NoSuchProviderException e) {
log.error("ERROR: " + e.getMessage());
return messageCountToReturn;
}
}
}
```


Tags: app

atlassian-sdk

confluence-app

confluence-server

sdk

server