package org.gbif.ipt.action.admin;
import org.gbif.ipt.action.POSTAction;
import org.gbif.ipt.config.AppConfig;
import org.gbif.ipt.model.Ipt;
import org.gbif.ipt.model.Organisation;
import org.gbif.ipt.service.AlreadyExistingException;
import org.gbif.ipt.service.RegistryException;
import org.gbif.ipt.service.RegistryException.TYPE;
import org.gbif.ipt.service.admin.RegistrationManager;
import org.gbif.ipt.service.registry.RegistryManager;
import org.gbif.ipt.struts2.SimpleTextProvider;
import org.gbif.ipt.validation.IptValidator;
import org.gbif.ipt.validation.OrganisationSupport;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
import com.google.inject.Inject;
import com.google.inject.servlet.SessionScoped;
import org.apache.log4j.Logger;
/**
* The Action responsible for all user input relating to the registration options.
*/
public class RegistrationAction extends POSTAction {
// logging
private static final Logger LOG = Logger.getLogger(RegistrationAction.class);
@SessionScoped
public static class RegisteredOrganisations {
private List<Organisation> organisations = new ArrayList<Organisation>();
private final RegistryManager registryManager;
@Inject
public RegisteredOrganisations(RegistryManager registryManager) {
this.registryManager = registryManager;
}
public boolean isLoaded() {
return !organisations.isEmpty();
}
public void load() throws RuntimeException {
LOG.debug("getting list of organisations from registry");
List<Organisation> tempOrganisations;
tempOrganisations = registryManager.getOrganisations();
organisations.clear();
// empty <option></option> needed by Select2 jquery library, to be able to display placeholder "Select an org.."
Organisation o = new Organisation();
o.setName("");
organisations.add(o);
organisations.addAll(tempOrganisations);
LOG.debug("organisations returned: " + organisations.size());
}
}
private static final long serialVersionUID = -6522969037528106704L;
private final RegistryManager registryManager;
private final OrganisationSupport organisationValidation;
private final IptValidator iptValidation;
private boolean validatedBaseURL = false;
private List<Organisation> organisations = new ArrayList<Organisation>();
private Organisation organisation;
private Ipt ipt;
private RegisteredOrganisations orgSession;
@Inject
public RegistrationAction(SimpleTextProvider textProvider, AppConfig cfg, RegistrationManager registrationManager,
RegistryManager registryManager, OrganisationSupport organisationValidation, IptValidator iptValidation,
RegisteredOrganisations orgSession) {
super(textProvider, cfg, registrationManager);
this.registryManager = registryManager;
this.organisationValidation = organisationValidation;
this.iptValidation = iptValidation;
this.orgSession = orgSession;
}
public Organisation getHostingOrganisation() {
return registrationManager.getHostingOrganisation();
}
/**
* @return the ipt
*/
public Ipt getIpt() {
return ipt;
}
/**
* @return the organisation
*/
public Organisation getOrganisation() {
return organisation;
}
/**
* @return the organisations
*/
public List<Organisation> getOrganisations() {
organisations.addAll(orgSession.organisations);
return organisations;
}
public String getRegistryURL() {
return cfg.getRegistryUrl() + "/registry/";
}
/**
* @return the validatedBaseURL
*/
public boolean getValidatedBaseURL() {
return validatedBaseURL;
}
@Override
public void prepare() {
super.prepare();
// will not be session scoping the list of organisations from the registry as this is basically a 1 time step
if (getRegisteredIpt() == null && !orgSession.isLoaded()) {
try {
orgSession.load();
} catch (RegistryException e) {
String msg = getText("admin.registration.error.registry");
if (e.getType() == TYPE.PROXY) {
msg = getText("admin.registration.error.proxy");
} else if (e.getType() == TYPE.SITE_DOWN) {
msg = getText("admin.registration.error.siteDown");
} else if (e.getType() == TYPE.NO_INTERNET) {
msg = getText("admin.registration.error.internetConnection");
}
LOG.error(msg, e);
addActionError(msg);
}
}
}
@Override
public String save() {
if (getRegisteredIpt() == null) {
try {
// register against the Registry
registryManager.registerIPT(ipt, organisation);
registrationManager.addHostingOrganisation(organisation);
// add the hosting organisation to the associated list of organisations as well
registrationManager.addAssociatedOrganisation(organisation);
// add the IPT proper info
registrationManager.addIptInstance(ipt);
registrationManager.save();
addActionMessage(getText("admin.registration.success"));
return SUCCESS;
} catch (RegistryException re) {
// add error message explaining why the Registry error occurred
String msg = RegistryException.logRegistryException(re.getType(), this);
addActionError(msg);
LOG.error(msg);
// add error message that explains the consequence of the Registry error
msg = getText("admin.registration.failed");
addActionError(msg);
LOG.error(msg);
return INPUT;
} catch (AlreadyExistingException e) {
LOG.error(e);
} catch (IOException e) {
LOG.error("The organisation association couldnt be saved: " + e.getMessage(), e);
addActionError(getText("admin.organisation.saveError"));
addActionError(e.getMessage());
return INPUT;
}
}
addActionError(getText("admin.registration.error.alreadyRegistered1"));
addActionError(getText("admin.registration.error.alreadyRegistered2"));
return SUCCESS;
}
/**
* @param ipt the ipt to set
*/
public void setIpt(Ipt ipt) {
this.ipt = ipt;
}
/**
* @param organisation the organisation to set
*/
public void setOrganisation(Organisation organisation) {
this.organisation = organisation;
}
/**
* @param organisations the organisations to set
*/
public void setOrganisations(List<Organisation> organisations) {
this.organisations = organisations;
}
public String update() {
try {
registryManager.updateIpt(getRegisteredIpt());
registrationManager.save();
addActionMessage(getText("admin.registration.success.update"));
} catch (RegistryException e) {
// add error message explaining why the Registry error occurred
String msg = RegistryException.logRegistryException(e.getType(), this);
addActionError(msg);
LOG.error(msg);
// add error message that explains the root cause of the Registry error
msg = getText("admin.registration.failed.update", new String[]{e.getMessage()});
addActionError(msg);
LOG.error(msg);
return INPUT;
} catch (IOException e) {
addActionError(e.getMessage());
LOG.error("Exception caught", e);
return INPUT;
}
return SUCCESS;
}
@Override
public void validate() {
if (isHttpPost()) {
if (getRegisteredIpt() != null) {
iptValidation.validateUpdate(this, getRegisteredIpt());
} else {
iptValidation.validate(this, ipt);
validatedBaseURL = true;
organisationValidation.validate(this, organisation);
}
}
}
}