Create
cancel
Showing results for 
Search instead for 
Did you mean: 
Sign up Log in

Next challenges

Recent achievements

  • Global
  • Personal

Recognition

  • Give kudos
  • Received
  • Given

Leaderboard

  • Global

Trophy case

Kudos (beta program)

Kudos logo

You've been invited into the Kudos (beta program) private group. Chat with others in the program, or give feedback to Atlassian.

View group

It's not the same without you

Join the community to find out what other Atlassian users are discussing, debating and creating.

Atlassian Community Hero Image Collage

How to access PluginSettings from other files and classes Edited

Hi!

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


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!

1 answer

1 accepted

0 votes
Answer accepted

Hi @Johan Jonsson Nilsson ,

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

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;
}
}
}

Suggest an answer

Log in or Sign up to answer
TAGS
Community showcase
Posted in Confluence

What do you think is the most *delightful* Confluence feature? Comment for a prize!

- Create your own custom emoji 🔥 - "Shake for Feedback" on mobile 📱 - An endless supply of GIFs via GIPHY 🤩 Is there anything quite as nice as a pleasant surprise? Comment below with what...

408 views 23 8
Join discussion

Community Events

Connect with like-minded Atlassian users at free events near you!

Find an event

Connect with like-minded Atlassian users at free events near you!

Unfortunately there are no Community Events near you at the moment.

Host an event

You're one step closer to meeting fellow Atlassian users at your local event. Learn more about Community Events

Events near you