public OSGi effects()

in component-dsl/src/main/java/org/apache/aries/component/dsl/internal/BaseOSGiImpl.java [228:300]


    public OSGi<T> effects(
        Consumer<? super T> onAddedBefore, Consumer<? super T> onAddedAfter,
        Consumer<? super T> onRemovedBefore,
        Consumer<? super T> onRemovedAfter,
        Consumer<? super T> onUpdate) {

        return transform(op -> t -> {
            onAddedBefore.accept(t);

            try {
                OSGiResult terminator = op.publish(t);

                OSGiResult result = new OSGiResultImpl(() -> {
                    try {
                        onRemovedBefore.accept(t);
                    }
                    catch (Exception e) {
                        //TODO: logging
                    }

                    try {
                        terminator.run();
                    }
                    catch (Exception e) {
                        //TODO: logging
                    }

                    try {
                        onRemovedAfter.accept(t);
                    }
                    catch (Exception e) {
                        //TODO: logging
                    }
                },
                    () -> {
                        AtomicBoolean atomicBoolean = new AtomicBoolean();

                        UpdateSupport.deferPublication(() -> {
                            if (!atomicBoolean.get()) {
                                onUpdate.accept(t);
                            }
                        });

                        atomicBoolean.set(terminator.update());

                        return atomicBoolean.get();
                    }
                );

                try {
                    onAddedAfter.accept(t);
                }
                catch (Exception e) {
                    result.run();

                    throw e;
                }

                return result;
            }
            catch (Exception e) {
                try {
                    onRemovedAfter.accept(t);
                }
                catch (Exception e1) {
                    //TODO: logging
                }

                throw e;
            }
                }
        );
    }