package com.yoghurt.crypto.transactions.server.servlets;
import java.io.IOException;
import java.util.Properties;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import com.google.gwt.user.server.rpc.RemoteServiceServlet;
import com.yoghurt.crypto.transactions.server.servlets.config.AuthenticatedConfigProvider;
import com.yoghurt.crypto.transactions.server.servlets.config.ConfigFactory;
import com.yoghurt.crypto.transactions.server.servlets.config.ConfigFactory.ConfigPropertiesRetriever;
import com.yoghurt.crypto.transactions.shared.domain.config.AdministratedApplicationConfig;
import com.yoghurt.crypto.transactions.shared.domain.config.UserApplicationConfig;
import com.yoghurt.crypto.transactions.shared.domain.exception.ApplicationException;
import com.yoghurt.crypto.transactions.shared.service.ConfigService;
@WebServlet("/application/config")
public class ConfigServlet extends RemoteServiceServlet implements ConfigService {
private static final long serialVersionUID = -4722553982090409634L;
private AuthenticatedConfigProvider configProvider;
@Override
public void init() throws ServletException {
super.init();
configProvider = new AuthenticatedConfigProvider();
}
@Override
public void updateServicePassword(final String oldPasswordHashed, final String newPasswordHashed) throws ApplicationException {
try {
configProvider.updateServicePassword(oldPasswordHashed, newPasswordHashed);
} catch (final IOException e) {
throw new ApplicationException();
}
}
@Override
public void setApplicationConfig(final String passwordHashed, final AdministratedApplicationConfig config) throws ApplicationException {
final ConfigPropertiesRetriever retriever = ConfigFactory.create(config);
try {
// Persist to config file
configProvider.setBlockchainHookConfig(passwordHashed, retriever.getProperties());
} catch (final IOException e) {
// File could not be written?
e.printStackTrace();
throw new ApplicationException();
}
// Persist to the factory singleton
BlockchainRetrievalFactory.set(config);
}
@Override
public AdministratedApplicationConfig attemptAutoConfig(final String passwordHashed, final AdministratedApplicationConfig config) throws ApplicationException {
final ConfigPropertiesRetriever retriever = ConfigFactory.create(config);
// TODO Try/catch this and report if we can't auto-configure.
retriever.attemptAutoFillProperties();
return retriever.getSystemConfig();
}
@Override
public boolean isPasswordPresent() throws ApplicationException {
try {
return configProvider.isPasswordPresent();
} catch (final IOException e) {
throw new ApplicationException();
}
}
@Override
public boolean isAuthentic(final String passwordHashed) throws ApplicationException {
return configProvider.isAuthentic(passwordHashed);
}
@Override
public AdministratedApplicationConfig getCurrentConfig(final String passwordHashed) throws ApplicationException {
if(!configProvider.isAuthentic(passwordHashed)) {
throw new ApplicationException();
}
Properties props;
try {
props = configProvider.getProperties();
} catch (final IOException e) {
e.printStackTrace();
throw new ApplicationException();
}
final ConfigPropertiesRetriever retriever = ConfigFactory.create(props);
return retriever.getSystemConfig();
}
@Override
public UserApplicationConfig getApplicationConfig() throws ApplicationException {
final Properties props;
try {
props = configProvider.getProperties();
} catch (final IOException e) {
e.printStackTrace();
throw new ApplicationException();
}
final ConfigPropertiesRetriever retriever = ConfigFactory.create(props);
return retriever.getApplicationConfig();
}
}