![JAR search and dependency download from the Maven repository](/logo.png)
org.praxislive.code.DataSink Maven / Gradle / Ivy
Go to download
Show more of this group Show more artifacts with this name
Show all versions of praxiscore-code Show documentation
Show all versions of praxiscore-code Show documentation
Forest-of-actors runtime supporting real-time systems and real-time recoding - bringing aspects of Erlang, Smalltalk and Extempore to Java.
/*
* 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