001: /*
002: * (c) Copyright 2007 by Volker Bergmann. All rights reserved.
003: *
004: * Redistribution and use in source and binary forms, with or without
005: * modification, is permitted under the terms of the
006: * GNU General Public License.
007: *
008: * For redistributing this software or a derivative work under a license other
009: * than the GPL-compatible Free Software License as defined by the Free
010: * Software Foundation or approved by OSI, you must first obtain a commercial
011: * license to this software product from Volker Bergmann.
012: *
013: * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
014: * WITHOUT A WARRANTY OF ANY KIND. ALL EXPRESS OR IMPLIED CONDITIONS,
015: * REPRESENTATIONS AND WARRANTIES, INCLUDING ANY IMPLIED WARRANTY OF
016: * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE OR NON-INFRINGEMENT, ARE
017: * HEREBY EXCLUDED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
018: * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
019: * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
020: * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
021: * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
022: * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
023: * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
024: * POSSIBILITY OF SUCH DAMAGE.
025: */
026:
027: package org.databene.benerator.main;
028:
029: import java.util.Collection;
030: import java.util.List;
031:
032: import org.databene.benerator.Generator;
033: import org.databene.commons.Escalator;
034: import org.databene.commons.LoggerEscalator;
035: import org.databene.model.consumer.Consumer;
036: import org.databene.model.data.Entity;
037: import org.databene.task.AbstractTask;
038: import org.databene.task.Task;
039: import org.databene.task.ThreadSafe;
040:
041: /**
042: * Task that creates one entity instance in a run() invocation.<br/><br/>
043: * Created: 01.02.2008 14:39:11
044: * @author Volker Bergmann
045: */
046: public class CreateEntityTask extends AbstractTask implements
047: ThreadSafe {
048:
049: private String name;
050: private Generator<Entity> generator;
051: private Collection<Consumer<Entity>> consumers;
052: private Escalator noConsumerHandler;
053: // private int generationCount;
054: private List<? extends Task> subTasks;
055: private boolean isSubTask;
056:
057: public CreateEntityTask(String name, Generator<Entity> generator,
058: Collection<Consumer<Entity>> consumers,
059: List<? extends Task> subTasks, boolean isSubTask) {
060: this .name = name;
061: this .generator = generator;
062: this .consumers = consumers;
063: this .noConsumerHandler = new LoggerEscalator();
064: // this.generationCount = 0;
065: this .subTasks = subTasks;
066: this .isSubTask = isSubTask;
067: }
068:
069: @Override
070: public boolean wantsToRun() {
071: return generator.available();
072: }
073:
074: public void run() {
075: Entity entity = null;
076: synchronized (generator) {
077: if (generator.available())
078: entity = generator.generate();
079: else
080: return;
081: }
082: if (consumers.size() == 0)
083: noConsumerHandler.escalate("No consumers defined ", this ,
084: null);
085: if (entity != null) {
086: context.set(name, entity);
087: // generationCount++;
088: for (Consumer<Entity> consumer : consumers)
089: consumer.startConsuming(entity);
090: for (Task subTask : subTasks) {
091: if (subTask instanceof PagedCreateEntityTask)
092: ((PagedCreateEntityTask) subTask).reset();
093: subTask.init(context);
094: subTask.run();
095: subTask.destroy();
096: }
097: for (Consumer<Entity> consumer : consumers)
098: consumer.finishConsuming(entity);
099: }
100: }
101:
102: @Override
103: public void destroy() {
104: if (!isSubTask)
105: for (Consumer<Entity> consumer : consumers)
106: consumer.flush();
107: super .destroy();
108: }
109:
110: @Override
111: public String toString() {
112: return getClass().getSimpleName() + '[' + name + ']';
113: }
114: }
|