All Downloads are FREE. Search and download functionalities are using the official Maven repository.

org.praxislive.code.DataSink Maven / Gradle / Ivy

Go to download

Forest-of-actors runtime supporting real-time systems and real-time recoding - bringing aspects of Erlang, Smalltalk and Extempore to Java.

There is a newer version: 6.0.0
Show newest version
/*
 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS HEADER.
 *
 * Copyright 2018 Neil C Smith.
 *
 * This code is free software; you can redistribute it and/or modify it
 * under the terms of the GNU Lesser General Public License version 3 only, as
 * published by the Free Software Foundation.
 *
 * This code 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 Lesser General Public License
 * version 3 for more details.
 *
 * You should have received a copy of the GNU Lesser General Public License version 3
 * along with this work; if not, see http://www.gnu.org/licenses/
 * 
 *
 * Please visit https://www.praxislive.org if you need additional information or
 * have any questions.
 */
package org.praxislive.code;

import java.lang.reflect.Field;
import java.lang.reflect.ParameterizedType;
import org.praxislive.code.userapi.Data;
import org.praxislive.core.Lookup;
import org.praxislive.core.services.LogLevel;

/**
 *
 *
 */
class DataSink extends Data.Sink {

    @Override
    public Lookup getLookup() {
        return Lookup.EMPTY;
    }

    static class Descriptor extends ReferenceDescriptor {

        private final Field sinkField;

        private CodeContext context;
        private DataSink sink;

        public Descriptor(String id, Field sinkField) {
            super(Descriptor.class, id);
            this.sinkField = sinkField;
        }

        @Override
        public void attach(CodeContext context, Descriptor previous) {

            this.context = context;

            if (previous != null) {
                if (isCompatible(previous)) {
                    sink = previous.sink;
                    previous.sink = null;
                } else {
                    previous.dispose();
                }
            }

            if (sink == null) {
                sink = new DataSink<>();
            }

            sink.attach(context);

            try {
                sinkField.set(context.getDelegate(), sink);
            } catch (Exception ex) {
                context.getLog().log(LogLevel.ERROR, ex);
            }

        }

        private boolean isCompatible(Descriptor other) {
            return sinkField.getGenericType().equals(other.sinkField.getGenericType());
        }

        @Override
        public void onInit() {
//                if (sink != null) {
//                    // dispose?
//                }
            sink = new DataSink<>();
            sink.attach(context);
            try {
                sinkField.set(context.getDelegate(), sink);
            } catch (Exception ex) {
                context.getLog().log(LogLevel.ERROR, ex);
            }
        }

        @Override
        public void onReset() {
            if (sink != null) {
                sink.reset();
            }
        }

        static Descriptor create(CodeConnector connector, Field field) {
            if (Data.Sink.class.equals(field.getType())
                    && field.getGenericType() instanceof ParameterizedType) {
                field.setAccessible(true);
                return new Descriptor(field.getName(), field);
            } else {
                return null;
            }
        }

    }

}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy