View Javadoc
1   /*
2    * (c) Copyright 2006-2020 by rapiddweller GmbH & Volker Bergmann. All rights reserved.
3    *
4    * Redistribution and use in source and binary forms, with or without
5    * modification, is permitted under the terms of the
6    * GNU General Public License.
7    *
8    * For redistributing this software or a derivative work under a license other
9    * than the GPL-compatible Free Software License as defined by the Free
10   * Software Foundation or approved by OSI, you must first obtain a commercial
11   * license to this software product from rapiddweller GmbH & Volker Bergmann.
12   *
13   * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
14   * WITHOUT A WARRANTY OF ANY KIND. ALL EXPRESS OR IMPLIED CONDITIONS,
15   * REPRESENTATIONS AND WARRANTIES, INCLUDING ANY IMPLIED WARRANTY OF
16   * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE OR NON-INFRINGEMENT, ARE
17   * HEREBY EXCLUDED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
18   * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
19   * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
20   * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
21   * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
22   * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
23   * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
24   * POSSIBILITY OF SUCH DAMAGE.
25   */
26  
27  package com.rapiddweller.benerator.engine;
28  
29  import com.rapiddweller.benerator.BeneratorFactory;
30  import com.rapiddweller.benerator.factory.DefaultsProvider;
31  import com.rapiddweller.benerator.factory.GeneratorFactory;
32  import com.rapiddweller.common.Context;
33  import com.rapiddweller.model.data.ComponentDescriptor;
34  import com.rapiddweller.model.data.DataModel;
35  import com.rapiddweller.model.data.DescriptorProvider;
36  import com.rapiddweller.model.data.TypeDescriptor;
37  import org.apache.logging.log4j.LogManager;
38  import org.apache.logging.log4j.Logger;
39  
40  import java.util.HashSet;
41  import java.util.Locale;
42  import java.util.Map.Entry;
43  import java.util.Set;
44  import java.util.concurrent.ExecutorService;
45  
46  /**
47   * Abstract implementation of the {@link BeneratorSubContext} interface.<br/><br/>
48   * Created: 26.01.2013 13:14:37
49   *
50   * @author Volker Bergmann
51   * @since 0.8.0
52   */
53  public abstract class AbstractBeneratorSubContext implements BeneratorSubContext {
54  
55    private static final Logger LOGGER = LogManager.getLogger(AbstractBeneratorSubContext.class);
56    /**
57     * The Parent.
58     */
59    protected final BeneratorContext parent;
60    /**
61     * The Current product name.
62     */
63    protected final String currentProductName;
64    private final Context localContext;
65  
66    /**
67     * Instantiates a new Abstract benerator sub context.
68     *
69     * @param productName the product name
70     * @param parent      the parent
71     */
72    public AbstractBeneratorSubContext(String productName, BeneratorContext parent) {
73      this.currentProductName = productName;
74      this.parent = parent;
75      this.localContext = BeneratorFactory.getInstance().createGenerationContext();
76    }
77  
78    @Override
79    public BeneratorContext getParent() {
80      return parent;
81    }
82  
83    @Override
84    public String getDefaultEncoding() {
85      return parent.getDefaultEncoding();
86    }
87  
88    // simple delegates ------------------------------------------------------------------------------------------------
89  
90    @Override
91    public void setDefaultEncoding(String defaultEncoding) {
92      parent.setDefaultEncoding(defaultEncoding);
93    }
94  
95    @Override
96    public String getDefaultLineSeparator() {
97      return parent.getDefaultLineSeparator();
98    }
99  
100   @Override
101   public void setDefaultLineSeparator(String defaultLineSeparator) {
102     parent.setDefaultLineSeparator(defaultLineSeparator);
103   }
104 
105   @Override
106   public Locale getDefaultLocale() {
107     return parent.getDefaultLocale();
108   }
109 
110   @Override
111   public void setDefaultLocale(Locale defaultLocale) {
112     parent.setDefaultLocale(defaultLocale);
113   }
114 
115   @Override
116   public void remove(String key) {
117     parent.remove(key);
118   }
119 
120   @Override
121   public String getDefaultDataset() {
122     return parent.getDefaultDataset();
123   }
124 
125   @Override
126   public void setDefaultDataset(String defaultDataset) {
127     parent.setDefaultDataset(defaultDataset);
128   }
129 
130   @Override
131   public long getDefaultPageSize() {
132     return parent.getDefaultPageSize();
133   }
134 
135   @Override
136   public void setDefaultPageSize(long defaultPageSize) {
137     parent.setDefaultPageSize(defaultPageSize);
138   }
139 
140   @Override
141   public String getDefaultScript() {
142     return parent.getDefaultScript();
143   }
144 
145   @Override
146   public void setDefaultScript(String defaultScript) {
147     parent.setDefaultScript(defaultScript);
148   }
149 
150   @Override
151   public boolean isDefaultNull() {
152     return parent.isDefaultNull();
153   }
154 
155   @Override
156   public void setDefaultNull(boolean defaultNull) {
157     parent.setDefaultNull(defaultNull);
158   }
159 
160   @Override
161   public char getDefaultSeparator() {
162     return parent.getDefaultSeparator();
163   }
164 
165   @Override
166   public void setDefaultSeparator(char defaultSeparator) {
167     parent.setDefaultSeparator(defaultSeparator);
168   }
169 
170   @Override
171   public String getDefaultErrorHandler() {
172     return parent.getDefaultErrorHandler();
173   }
174 
175   @Override
176   public void setDefaultErrorHandler(String defaultErrorHandler) {
177     parent.setDefaultErrorHandler(defaultErrorHandler);
178   }
179 
180   @Override
181   public String getContextUri() {
182     return parent.getContextUri();
183   }
184 
185   @Override
186   public void setContextUri(String contextUri) {
187     parent.setContextUri(contextUri);
188   }
189 
190   @Override
191   public boolean isValidate() {
192     return parent.isValidate();
193   }
194 
195   @Override
196   public void setValidate(boolean validate) {
197     parent.setValidate(validate);
198   }
199 
200   @Override
201   public Long getMaxCount() {
202     return parent.getMaxCount();
203   }
204 
205   @Override
206   public void setMaxCount(Long maxCount) {
207     parent.setMaxCount(maxCount);
208   }
209 
210   @Override
211   public GeneratorFactory getGeneratorFactory() {
212     return parent.getGeneratorFactory();
213   }
214 
215   @Override
216   public void setGeneratorFactory(GeneratorFactory generatorFactory) {
217     parent.setGeneratorFactory(generatorFactory);
218   }
219 
220   @Override
221   public Object getGlobal(String name) {
222     return parent.getGlobal(name);
223   }
224 
225   @Override
226   public DefaultsProvider getDefaultsProvider() {
227     return parent.getDefaultsProvider();
228   }
229 
230   @Override
231   public void setDefaultsProvider(DefaultsProvider defaultsProvider) {
232     parent.setDefaultsProvider(defaultsProvider);
233   }
234 
235   @Override
236   public Class<?> forName(String className) {
237     return parent.forName(className);
238   }
239 
240   @Override
241   public ExecutorService getExecutorService() {
242     return parent.getExecutorService();
243   }
244 
245   @Override
246   public void setGlobal(String name, Object value) {
247     parent.setGlobal(name, value);
248   }
249 
250   @Override
251   public String resolveRelativeUri(String relativeUri) {
252     return parent.resolveRelativeUri(relativeUri);
253   }
254 
255   @Override
256   public void close() {
257     parent.close();
258   }
259 
260   @Override
261   public void importClass(String className) {
262     parent.importClass(className);
263   }
264 
265   @Override
266   public void importPackage(String packageName) {
267     parent.importPackage(packageName);
268   }
269 
270   @Override
271   public void importDefaults() {
272     parent.importDefaults();
273   }
274 
275   @Override
276   public ComponentDescriptor getDefaultComponentConfig(String name) {
277     return parent.getDefaultComponentConfig(name);
278   }
279 
280   @Override
281   public void setDefaultComponentConfig(ComponentDescriptor component) {
282     parent.setDefaultComponentConfig(component);
283   }
284 
285   @Override
286   public boolean isDefaultOneToOne() {
287     return parent.isDefaultOneToOne();
288   }
289 
290   @Override
291   public void setDefaultOneToOne(boolean defaultOneToOne) {
292     parent.setDefaultOneToOne(defaultOneToOne);
293   }
294 
295   @Override
296   public boolean isAcceptUnknownSimpleTypes() {
297     return parent.isAcceptUnknownSimpleTypes();
298   }
299 
300   @Override
301   public void setAcceptUnknownSimpleTypes(boolean acceptUnknownSimpleTypes) {
302     parent.setAcceptUnknownSimpleTypes(acceptUnknownSimpleTypes);
303   }
304 
305   @Override
306   public boolean isDefaultImports() {
307     return parent.isDefaultImports();
308   }
309 
310   @Override
311   public void setDefaultImports(boolean defaultImports) {
312     parent.setDefaultImports(defaultImports);
313   }
314 
315   @Override
316   public DataModel getDataModel() {
317     return parent.getDataModel();
318   }
319 
320   @Override
321   public void setDataModel(DataModel dataModel) {
322     parent.setDataModel(dataModel);
323   }
324 
325   @Override
326   public DescriptorProvider getLocalDescriptorProvider() {
327     return parent.getLocalDescriptorProvider();
328   }
329 
330   @Override
331   public void addLocalType(TypeDescriptor type) {
332     parent.addLocalType(type);
333   }
334 
335 
336   // Functional interface --------------------------------------------------------------------------------------------
337 
338   @Override
339   public boolean hasProductNameInScope(String currentProductName) {
340     return (this.currentProductName != null && this.currentProductName.equals(currentProductName))
341         || (parent != null && parent.hasProductNameInScope(currentProductName));
342   }
343 
344   @Override
345   public boolean contains(String key) {
346     return key != null && (key.equalsIgnoreCase(currentProductName) || "this".equalsIgnoreCase(key) ||
347         localContext.contains(key) || parent.contains(key));
348   }
349 
350   @Override
351   public Object get(String key) {
352     if (key == null) {
353       return null;
354     } else if (localContext.contains(key)) {
355       return localContext.get(key);
356     } else if (key.equalsIgnoreCase(currentProductName) || "this".equalsIgnoreCase(key)) {
357       return getCurrentProduct().unwrap();
358     } else {
359       return parent.get(key);
360     }
361   }
362 
363   @Override
364   public void set(String key, Object value) {
365     localContext.set(key, value);
366   }
367 
368   @Override
369   public Set<String> keySet() {
370     Set<String> keySet = new HashSet<>(parent.keySet());
371     keySet.addAll(localContext.keySet());
372     return keySet;
373   }
374 
375   @Override
376   public Set<Entry<String, Object>> entrySet() {
377     try {
378       Set<Entry<String, Object>> entrySet = new HashSet<>(parent.entrySet());
379       entrySet.addAll(localContext.entrySet());
380       return entrySet;
381     } catch (NullPointerException e) {
382       return localContext.entrySet();
383     }
384 
385 
386   }
387 
388 
389   // java.lang.Object overrides --------------------------------------------------------------------------------------
390 
391   @Override
392   public String toString() {
393     return getClass().getSimpleName() + "(" + currentProductName + ")";
394   }
395 
396 }