package org.infinispan.cli.interpreter.statement; import java.util.Iterator; import java.util.List; import java.util.Map; import org.infinispan.Cache; import org.infinispan.cli.interpreter.logging.Log; import org.infinispan.cli.interpreter.result.EmptyResult; import org.infinispan.cli.interpreter.result.Result; import org.infinispan.cli.interpreter.result.StatementException; import org.infinispan.cli.interpreter.result.StringResult; import org.infinispan.cli.interpreter.session.Session; import org.infinispan.manager.EmbeddedCacheManager; import org.infinispan.util.logging.LogFactory; import org.infinispan.xsite.GlobalXSiteAdminOperations; import org.infinispan.xsite.XSiteAdminOperations; /** * Performs operation related to Cross-Site Replication * * @author Tristan Tarrant * @since 5.2 */ public class SiteStatement implements Statement { private static final Log log = LogFactory.getLog(SiteStatement.class, Log.class); enum Options { OFFLINE, ONLINE, STATUS, PUSH, CANCELPUSH, CANCELRECEIVE, PUSHSTATUS, CLEARPUSHSTATUS, SENDINGSITE, ONLINEALL, OFFLINEALL, PUSHALL, CANCELPUSHALL } final private SiteData siteData; final private List<Option> options; public SiteStatement(List<Option> options, SiteData siteData) { this.options = options; this.siteData = siteData; } @Override public Result execute(Session session) throws StatementException { if (options.isEmpty()) { return EmptyResult.RESULT; } Options option = options.get(0).toEnum(Options.class); if (isGlobalOption(option)) { return executeContainerOperation(option, session); } else { return executeCacheOperation(option, session); } } private Result executeCacheOperation(Options option, Session session) throws StatementException { Cache<Object, Object> cache = session.getCache(siteData != null ? siteData.getCacheName() : null); String siteName = siteData != null ? siteData.getSiteName() : null; XSiteAdminOperations xsiteAdmin = cache.getAdvancedCache().getComponentRegistry().getComponent(XSiteAdminOperations.class); requireXSiteAdmin(xsiteAdmin, cache.getName()); switch (option) { case STATUS: { return new StringResult(siteName == null ? xsiteAdmin.status() : xsiteAdmin.siteStatus(siteName)); } case ONLINE: { requireSiteName(siteName); return new StringResult(xsiteAdmin.bringSiteOnline(siteName)); } case OFFLINE: { requireSiteName(siteName); return new StringResult(xsiteAdmin.takeSiteOffline(siteName)); } case PUSH: { requireSiteName(siteName); return new StringResult(xsiteAdmin.pushState(siteName)); } case CANCELPUSH: { requireSiteName(siteName); return new StringResult(xsiteAdmin.cancelPushState(siteName)); } case CANCELRECEIVE: { requireSiteName(siteName); return new StringResult(xsiteAdmin.cancelReceiveState(siteName)); } case PUSHSTATUS: { return new StringResult(prettyPrintMap(xsiteAdmin.getPushStateStatus())); } case CLEARPUSHSTATUS: { return new StringResult(xsiteAdmin.clearPushStateStatus()); } case SENDINGSITE: { return new StringResult(xsiteAdmin.getSendingSiteName()); } default: return EmptyResult.RESULT; } } private Result executeContainerOperation(Options option, Session session) throws StatementException { EmbeddedCacheManager cacheManager = session.getCacheManager(); GlobalXSiteAdminOperations xSiteAdmin = cacheManager.getGlobalComponentRegistry().getComponent(GlobalXSiteAdminOperations.class); String siteName = siteData != null ? siteData.getSiteName() : null; requireSiteName(siteName); switch (option) { case OFFLINEALL: { return new StringResult(xSiteAdmin.takeSiteOffline(siteName)); } case ONLINEALL: { return new StringResult(xSiteAdmin.bringSiteOnline(siteName)); } case PUSHALL: { return new StringResult(xSiteAdmin.pushState(siteName)); } case CANCELPUSHALL: { return new StringResult(xSiteAdmin.cancelPushState(siteName)); } default: return EmptyResult.RESULT; } } private static boolean isGlobalOption(Options option) { switch (option) { case OFFLINEALL: case ONLINEALL: case PUSHALL: case CANCELPUSHALL: return true; default: return false; } } private static void requireXSiteAdmin(XSiteAdminOperations xSiteAdminOperations, String cacheName) throws StatementException { if (xSiteAdminOperations == null) { throw log.noBackupsForCache(cacheName); } } private static void requireSiteName(String siteName) throws StatementException { if (siteName == null) { throw log.siteNameNotSpecified(); } } private static String prettyPrintMap(Map<?, ?> map) { if (map.isEmpty()) { return ""; } StringBuilder builder = new StringBuilder(); for (Iterator<? extends Map.Entry<?, ?>> iterator = map.entrySet().iterator(); iterator.hasNext(); ) { Map.Entry<?, ?> entry = iterator.next(); builder.append(entry.getKey()).append("=").append(entry.getValue()); if (iterator.hasNext()) { builder.append(System.lineSeparator()); } } return builder.toString(); } }