/*
* (c) Copyright 2011 by Volker Bergmann. All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, is permitted under the terms of the
* GNU General Public License (GPL).
*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
* WITHOUT A WARRANTY OF ANY KIND. ALL EXPRESS OR IMPLIED CONDITIONS,
* REPRESENTATIONS AND WARRANTIES, INCLUDING ANY IMPLIED WARRANTY OF
* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE OR NON-INFRINGEMENT, ARE
* HEREBY EXCLUDED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
* LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
* SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
* INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
* CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
* POSSIBILITY OF SUCH DAMAGE.
*/
package org.databene.benerator.engine;
import java.util.HashSet;
import java.util.Locale;
import java.util.Map.Entry;
import java.util.Set;
import java.util.concurrent.ExecutorService;
import org.databene.benerator.factory.DefaultsProvider;
import org.databene.benerator.factory.GeneratorFactory;
import org.databene.benerator.wrapper.ProductWrapper;
import org.databene.commons.Context;
import org.databene.commons.context.CaseInsensitiveContext;
import org.databene.model.data.ComponentDescriptor;
import org.databene.model.data.DataModel;
import org.databene.model.data.DescriptorProvider;
import org.databene.model.data.TypeDescriptor;
/**
* Sub context version of the {@link BeneratorContext}.<br/><br/>
* Created: 02.09.2011 14:35:59
* @since 0.7.0
* @author Volker Bergmann
*/
public class BeneratorSubContext implements BeneratorContext {
private BeneratorContext parent;
private Context localContext = new CaseInsensitiveContext(true);
private ProductWrapper<?> currentProduct;
private String currentProductName;
public BeneratorSubContext(BeneratorContext parent) {
this.parent = parent;
this.currentProductName = null;
}
public BeneratorContext getParent() {
return parent;
}
public String getDefaultEncoding() {
return parent.getDefaultEncoding();
}
public Object get(String key) {
if (localContext.contains(key))
return localContext.get(key);
else
return parent.get(key);
}
public void set(String key, Object value) {
localContext.set(key, value);
}
public ProductWrapper<?> getCurrentProduct() {
return currentProduct;
}
public void setCurrentProduct(ProductWrapper<?> currentProduct) {
this.currentProduct = currentProduct;
if (currentProduct != null)
set("this", currentProduct.unwrap());
else
remove("this");
}
public Set<String> keySet() {
Set<String> keySet = new HashSet<String>(parent.keySet());
keySet.addAll(localContext.keySet());
return keySet;
}
public Set<Entry<String, Object>> entrySet() {
Set<Entry<String, Object>> entrySet = new HashSet<Entry<String,Object>>(parent.entrySet());
entrySet.addAll(localContext.entrySet());
return entrySet;
}
// simple delegates ------------------------------------------------------------------------------------------------
public String getDefaultLineSeparator() {
return parent.getDefaultLineSeparator();
}
public Locale getDefaultLocale() {
return parent.getDefaultLocale();
}
public void remove(String key) {
parent.remove(key);
}
public String getDefaultDataset() {
return parent.getDefaultDataset();
}
public long getDefaultPageSize() {
return parent.getDefaultPageSize();
}
public String getDefaultScript() {
return parent.getDefaultScript();
}
public boolean isDefaultNull() {
return parent.isDefaultNull();
}
public boolean contains(String key) {
return localContext.contains(key) || parent.contains(key);
}
public char getDefaultSeparator() {
return parent.getDefaultSeparator();
}
public String getDefaultErrorHandler() {
return parent.getDefaultErrorHandler();
}
public String getContextUri() {
return parent.getContextUri();
}
public boolean isValidate() {
return parent.isValidate();
}
public Long getMaxCount() {
return parent.getMaxCount();
}
public BeneratorContext createSubContext() {
return new BeneratorSubContext(this);
}
public GeneratorFactory getGeneratorFactory() {
return parent.getGeneratorFactory();
}
public void setGeneratorFactory(GeneratorFactory generatorFactory) {
parent.setGeneratorFactory(generatorFactory);
}
public Object getSetting(String name) {
return parent.getSetting(name);
}
public DefaultsProvider getDefaultsProvider() {
return parent.getDefaultsProvider();
}
public void setDefaultsProvider(DefaultsProvider defaultsProvider) {
parent.setDefaultsProvider(defaultsProvider);
}
public Class<?> forName(String className) {
return parent.forName(className);
}
public ExecutorService getExecutorService() {
return parent.getExecutorService();
}
public void setSetting(String name, Object value) {
parent.setSetting(name, value);
}
public String resolveRelativeUri(String relativeUri) {
return parent.resolveRelativeUri(relativeUri);
}
public void close() {
parent.close();
}
public void importClass(String className) {
parent.importClass(className);
}
public void importPackage(String packageName) {
parent.importPackage(packageName);
}
public void importDefaults() {
parent.importDefaults();
}
public void setDefaultEncoding(String defaultEncoding) {
parent.setDefaultEncoding(defaultEncoding);
}
public void setDefaultLineSeparator(String defaultLineSeparator) {
parent.setDefaultLineSeparator(defaultLineSeparator);
}
public void setDefaultLocale(Locale defaultLocale) {
parent.setDefaultLocale(defaultLocale);
}
public void setDefaultDataset(String defaultDataset) {
parent.setDefaultDataset(defaultDataset);
}
public void setDefaultPageSize(long defaultPageSize) {
parent.setDefaultPageSize(defaultPageSize);
}
public void setDefaultScript(String defaultScript) {
parent.setDefaultScript(defaultScript);
}
public void setDefaultNull(boolean defaultNull) {
parent.setDefaultNull(defaultNull);
}
public void setDefaultSeparator(char defaultSeparator) {
parent.setDefaultSeparator(defaultSeparator);
}
public ComponentDescriptor getDefaultComponentConfig(String name) {
return parent.getDefaultComponentConfig(name);
}
public void setDefaultComponentConfig(ComponentDescriptor component) {
parent.setDefaultComponentConfig(component);
}
public void setDefaultErrorHandler(String defaultErrorHandler) {
parent.setDefaultErrorHandler(defaultErrorHandler);
}
public void setContextUri(String contextUri) {
parent.setContextUri(contextUri);
}
public void setValidate(boolean validate) {
parent.setValidate(validate);
}
public void setMaxCount(Long maxCount) {
parent.setMaxCount(maxCount);
}
public void setExecutorService(ExecutorService executorService) {
parent.setExecutorService(executorService);
}
public boolean isDefaultOneToOne() {
return parent.isDefaultOneToOne();
}
public void setDefaultOneToOne(boolean defaultOneToOne) {
parent.setDefaultOneToOne(defaultOneToOne);
}
public boolean isAcceptUnknownSimpleTypes() {
return parent.isAcceptUnknownSimpleTypes();
}
public void setAcceptUnknownSimpleTypes(boolean acceptUnknownSimpleTypes) {
parent.setAcceptUnknownSimpleTypes(acceptUnknownSimpleTypes);
}
public boolean isDefaultImports() {
return parent.isDefaultImports();
}
public void setDefaultImports(boolean defaultImports) {
parent.setDefaultImports(defaultImports);
}
public DataModel getDataModel() {
return parent.getDataModel();
}
public void setDataModel(DataModel dataModel) {
parent.setDataModel(dataModel);
}
public DescriptorProvider getLocalDescriptorProvider() {
return parent.getLocalDescriptorProvider();
}
public void addLocalType(TypeDescriptor type) {
parent.addLocalType(type);
}
public void setCurrentProductName(String currentProductName) {
this.currentProductName = currentProductName;
}
public boolean hasProductNameInScope(String currentProductName) {
return (this.currentProductName != null && this.currentProductName.equals(currentProductName))
|| (parent != null && parent.hasProductNameInScope(currentProductName));
}
}