<html><head><meta name="color-scheme" content="light dark"></head><body><pre style="word-wrap: break-word; white-space: pre-wrap;">/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package usda.weru.conversionapi.impl;

import java.util.Collection;
import org.openide.util.RequestProcessor;
import org.openide.util.lookup.Lookups;
import usda.weru.conversionapi.ConversionEngine;
import usda.weru.conversionapi.PostProcessor;
import usda.weru.conversionapi.PreProcessor;
import usda.weru.conversionapi.Row;
import usda.weru.conversionapi.filetypes.ManagementRotationDataNode;
import usda.weru.conversionapi.filetypes.ManagementRotationDataObject;
import usda.weru.conversionapi.handlers.DateHandler;
import usda.weru.conversionapi.handlers.FileObjectHandler;
import usda.weru.conversionapi.handlers.TranslationHandler;
import usda.weru.conversionapi.handlers.ValidationHandler;

/**
 *
 * @author lrdinuki
 */
public class ConversionEngineImpl implements ConversionEngine {
    private static ConversionEngine c_instance;
    private RequestProcessor c_daemon;

    private ConversionEngineImpl() {
        c_daemon=new RequestProcessor("Conversion Daemon", 100, true);

    }

    public synchronized static ConversionEngine findInstance() {
        if (c_instance == null) {
            c_instance=new ConversionEngineImpl();
        }
        return c_instance;
    }

    public void doConversion(ManagementRotationDataObject dataObject) {
        RequestProcessor.Task task=c_daemon.create(new ConversionThread(dataObject));
        task.schedule(250);
    }

    public void doConversion(ManagementRotationDataNode dataNode) {
        doConversion(ManagementRotationDataObject.class.cast(dataNode.getDataObject()));
    }

    private class ConversionThread extends Thread {
        ManagementRotationDataObject ic_dataObject;

        public ConversionThread(ManagementRotationDataObject dataObject) {
            ic_dataObject=dataObject;
        }

        @Override
        public void run() {
            if (Thread.interrupted()) {
                return;
            }
            //TODO conversion processing...
            Collection&lt;? extends PreProcessor&gt; preProcessors=Lookups.forPath("USDA/WERU/ConversionTool/PreProcessor").lookupAll(PreProcessor.class);
            for (PreProcessor processor : preProcessors) {
                processor.process(ic_dataObject);
                if (Thread.interrupted()) {
                    return;
                }
            }
            Collection&lt;? extends TranslationHandler&gt; translationHandlers=Lookups.forPath("USDA/WERU/ConversionTool/Handler/Translation").lookupAll(TranslationHandler.class);
            for (TranslationHandler handler : translationHandlers) {
                for (Row row : ic_dataObject.getData()) {
                    if (handler.canTranslate(row)) {
                        handler.translate(row);
                        continue;
                    }
                    if (Thread.interrupted()) {
                        return;
                    }
                }
                if (Thread.interrupted()) {
                    return;
                }
            }
            Collection&lt;? extends FileObjectHandler&gt; fileObjectHandlers=Lookups.forPath("USDA/WERU/ConversionTool/Handler/FileObject").lookupAll(FileObjectHandler.class);
            for (FileObjectHandler handler : fileObjectHandlers) {
                for (Row row : ic_dataObject.getData()) {
                    if (handler.canTranslate(row.getCrop())) {
                        handler.translate(row.getCrop(), row.getAvailableCrops());
                    }
                    if (handler.canTranslate(row.getOperation())) {
                        handler.translate(row.getOperation(), row.getAvailableOperations());
                    }
                    if (Thread.interrupted()) {
                        return;
                    }
                }
                if (Thread.interrupted()) {
                    return;
                }
            }
            Collection&lt;? extends DateHandler&gt; dateHandlers=Lookups.forPath("USDA/WERU/ConversionTool/Handler/Date").lookupAll(DateHandler.class);
            for (DateHandler handler : dateHandlers) {
                if (handler.canHandle(ic_dataObject)) {
                    ic_dataObject.addDateHandler(handler);
                }
                if (Thread.interrupted()) {
                    return;
                }
            }
            Collection&lt;? extends PostProcessor&gt; postProcessors=Lookups.forPath("USDA/WERU/ConversionTool/PreProcessor").lookupAll(PostProcessor.class);
            for (PostProcessor processor : postProcessors) {
                processor.process(ic_dataObject);
                if (Thread.interrupted()) {
                    return;
                }
            }
            Collection&lt;? extends ValidationHandler&gt; validationHandlers=Lookups.forPath("USDA/WERU/ConversionTool/Handler/Validation").lookupAll(ValidationHandler.class);
            for (ValidationHandler handler : validationHandlers) {
                if(handler.validate(ic_dataObject)) {
                    break;
                }
                if (Thread.interrupted()) {
                    return;
                }
            }
        }
    }
}
</pre></body></html>