package org.infinispan.configuration.cache;
import static org.infinispan.configuration.cache.SitesConfiguration.DISABLE_BACKUPS;
import static org.infinispan.configuration.cache.SitesConfiguration.IN_USE_BACKUP_SITES;
import java.util.ArrayList;
import java.util.HashSet;
import java.util.List;
import java.util.Set;
import org.infinispan.commons.configuration.Builder;
import org.infinispan.commons.configuration.attributes.AttributeSet;
import org.infinispan.configuration.global.GlobalConfiguration;
import org.infinispan.util.logging.Log;
import org.infinispan.util.logging.LogFactory;
/**
* @author Mircea.Markus@jboss.com
* @since 5.2
*/
public class SitesConfigurationBuilder extends AbstractConfigurationChildBuilder implements Builder<SitesConfiguration> {
private final static Log log = LogFactory.getLog(SitesConfigurationBuilder.class);
private final AttributeSet attributes;
private final List<BackupConfigurationBuilder> backups = new ArrayList<>(2);
private final BackupForBuilder backupForBuilder;
public SitesConfigurationBuilder(ConfigurationBuilder builder) {
super(builder);
attributes = SitesConfiguration.attributeDefinitionSet();
backupForBuilder = new BackupForBuilder(builder);
}
public BackupConfigurationBuilder addBackup() {
BackupConfigurationBuilder bcb = new BackupConfigurationBuilder(getBuilder());
backups.add(bcb);
return bcb;
}
public List<BackupConfigurationBuilder> backups() {
return backups;
}
/**
* Returns true if this cache won't backup its data remotely.
* It would still accept other sites backing up data on this site.
*/
public SitesConfigurationBuilder disableBackups(boolean disable) {
attributes.attribute(DISABLE_BACKUPS).set(disable);
return this;
}
/**
* Defines the site names, from the list of sites names defined within 'backups' element, to
* which this cache backups its data.
*/
public SitesConfigurationBuilder addInUseBackupSite(String site) {
Set<String> sites = attributes.attribute(IN_USE_BACKUP_SITES).get();
sites.add(site);
attributes.attribute(IN_USE_BACKUP_SITES).set(sites);
return this;
}
public BackupForBuilder backupFor() {
return backupForBuilder;
}
@Override
public void validate() {
backupForBuilder.validate();
//don't allow two backups with the same name
Set<String> backupNames = new HashSet<>(backups.size());
for (BackupConfigurationBuilder bcb : backups) {
if (!backupNames.add(bcb.site())) {
throw log.multipleSitesWithSameName(bcb.site());
}
bcb.validate();
}
for (String site : attributes.attribute(IN_USE_BACKUP_SITES).get()) {
boolean found = false;
for (BackupConfigurationBuilder bcb : backups) {
if (bcb.site().equals(site)) found = true;
}
if (!found) {
throw log.siteMustBeInBackups(site);
}
}
}
@Override
public void validate(GlobalConfiguration globalConfig) {
backupForBuilder.validate(globalConfig);
for (BackupConfigurationBuilder bcb : backups) {
bcb.validate(globalConfig);
}
}
@Override
public SitesConfiguration create() {
List<BackupConfiguration> backupConfigurations = new ArrayList<>(backups.size());
for (BackupConfigurationBuilder bcb : this.backups) {
backupConfigurations.add(bcb.create());
}
return new SitesConfiguration(attributes.protect(), backupConfigurations, backupForBuilder.create());
}
@Override
public SitesConfigurationBuilder read(SitesConfiguration template) {
this.attributes.read(template.attributes());
backupForBuilder.read(template.backupFor());
//backups.clear();
for (BackupConfiguration bc : template.allBackups()) {
BackupConfigurationBuilder bcb = new BackupConfigurationBuilder(getBuilder());
bcb.read(bc);
backups.add(bcb);
}
return this;
}
}