package com.tesora.dve.testprovider; /* * #%L * Tesora Inc. * Database Virtualization Engine * %% * Copyright (C) 2011 - 2014 Tesora Inc. * %% * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU Affero General Public License, version 3, * as published by the Free Software Foundation. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Affero General Public License for more details. * * You should have received a copy of the GNU Affero General Public License * along with this program. If not, see <http://www.gnu.org/licenses/>. * #L% */ import java.io.File; import java.io.InputStream; import java.util.Collection; import java.util.LinkedList; import java.util.List; import javax.xml.bind.JAXBContext; import javax.xml.bind.JAXBException; import javax.xml.bind.Marshaller; import javax.xml.bind.Unmarshaller; import com.tesora.dve.common.catalog.CatalogEntity; import com.tesora.dve.common.catalog.StorageSite; import com.tesora.dve.exceptions.PEException; import com.tesora.dve.server.messaging.GetWorkerRequest; import com.tesora.dve.siteprovider.SiteProviderContextForProvision; import com.tesora.dve.siteprovider.SiteProviderPlugin; import com.tesora.dve.variables.ScopedVariableHandler; import com.tesora.dve.variables.ScopedVariables; import com.tesora.dve.worker.SiteManagerCommand; public class StaticSiteProvider implements SiteProviderPlugin { SiteProviderConfig providerConfig; String providerName; String configString; boolean isEnabled; public StaticSiteProvider() throws PEException { } private SiteProviderConfig parseXML() throws PEException { String configFileName = getProviderName() + ".xml"; SiteProviderConfig providerConfig; try { InputStream is = getClass().getResourceAsStream(configFileName); if (is == null) throw new PEException("Cannot load " + configFileName + " from classpath"); JAXBContext jc = JAXBContext.newInstance(SiteProviderConfig.class); Unmarshaller u = jc.createUnmarshaller(); providerConfig = (SiteProviderConfig) u.unmarshal(is); if (providerConfig.siteClassMap.isEmpty()) throw new PEException(configFileName + " contained no SiteClasses"); } catch (JAXBException e) { throw new PEException("JAXB exception reading " + configFileName, e); } return providerConfig; } @Override public void close() { } @Override public void initialize(SiteProviderContext ctxt, String name, boolean isEnabled, String config) throws PEException { this.providerName = name; this.isEnabled = isEnabled; this.configString = config; providerConfig = parseXML(); } public ScopedVariables getVariableConfiguration() throws PEException { return new ScopedVariables(providerName, new EnabledVariableHandler(providerName,"enabled"), new ConfigVariableHandler(providerName,"config")); } @Override public boolean isEnabled() { return isEnabled; } @Override public void setEnabled(boolean parseBoolean) throws PEException { SiteProviderContextForProvision ctxt = new SiteProviderContextForProvision(getProviderName()); try { ctxt.setProviderEnabled(parseBoolean); this.isEnabled = parseBoolean; } finally { ctxt.close(); } } public String getProviderConfig() { return configString; } public void setProviderConfig(String providerConfig) throws PEException { SiteProviderContextForProvision ctxt = new SiteProviderContextForProvision(getProviderName()); try { ctxt.setProviderConfig(providerConfig); this.configString = providerConfig; } finally { ctxt.close(); } this.configString = providerConfig; } @Override public String getProviderName() { return providerName; } @Override public void returnSitesByClass(SiteProviderContext ctxt, String siteClass, Collection<? extends StorageSite> sites) { providerConfig.returnSitesByClass(siteClass, sites); } @Override public void provisionWorkerRequest(SiteProviderContext ctxt, GetWorkerRequest req) throws PEException { String siteClass = req.getSiteClassName(); int siteCount = req.getSiteCount(); req.fulfillGetWorkerRequest(providerConfig.getSitesByClass(siteClass, siteCount)); } @Override public List<CatalogEntity> show(SiteManagerCommand smc) throws PEException { return null; } @Override public SiteManagerCommand prepareUpdate(SiteManagerCommand smc) throws PEException { return null; } @Override public int update(SiteManagerCommand smc) throws PEException { return 0; } @Override public void rollback(SiteManagerCommand smc) throws PEException { } // To generate an example StaticSiteManager configuration file public static void main(String[] args) { String[] classes = new String[] { "agg", "sm", "med", "lrg" }; SiteProviderConfig smc = new SiteProviderConfig(); for (String className : classes) { SiteClass sc = new SiteClass(className, 1); sc.allSites = new LinkedList<SiteInfo>(); for (int i = 1; i < 6; ++i) { SiteInfo si = new SiteInfo(className + "Stat" + i, "jdbc:mysql://localhost"); sc.allSites.add(si); } smc.addSiteClass(sc); } try { JAXBContext jc = JAXBContext.newInstance(SiteProviderConfig.class); Marshaller m = jc.createMarshaller(); m.setProperty( Marshaller.JAXB_FORMATTED_OUTPUT, Boolean.TRUE ); m.marshal(smc, new File("providerSample.xml")); new StaticSiteProvider(); } catch (Exception e) { e.printStackTrace(); } } protected StaticSiteProvider getProvider(String providerName) throws PEException { return (StaticSiteProvider) SiteProviderFactory.getInstance(providerName); } class EnabledVariableHandler extends ScopedVariableHandler { private final String scopeName; public EnabledVariableHandler(String scopeName, String myName) { super(myName); this.scopeName = scopeName; } @Override public void setValue(String value) throws PEException { getProvider(scopeName).setEnabled(Boolean.parseBoolean(value)); } @Override public String getValue() throws PEException { return Boolean.toString(getProvider(scopeName).isEnabled()); } } class ConfigVariableHandler extends ScopedVariableHandler { private final String scopeName; public ConfigVariableHandler(String scopeName, String myName) { super(myName); this.scopeName = scopeName; } @Override public void setValue(String value) throws PEException { getProvider(scopeName).setProviderConfig(value); } @Override public String getValue() throws PEException { return getProvider(scopeName).getProviderConfig(); } } @Override public Collection<? extends StorageSite> getAllSites() { return null; } }