public EffectsOSGi()

in component-dsl/src/main/java/org/apache/aries/component/dsl/internal/EffectsOSGi.java [29:98]


    public EffectsOSGi(
        Runnable onAddingBefore, Runnable onAddingAfter,
        Runnable onRemovingBefore, Runnable onRemovingAfter, Runnable onUpdate) {

        super((executionContext, op) -> {
            onAddingBefore.run();

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

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

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

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

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

                        atomicBoolean.set(terminator.update());

                        return atomicBoolean.get();
                    }                );

                try {
                    onAddingAfter.run();
                }
                catch (Exception e) {
                    result.run();

                    throw e;
                }

                return result;
            }
            catch (Exception e) {
                try {
                    onRemovingAfter.run();
                }
                catch (Exception e1) {
                    //TODO: logging
                }

                throw e;
            }
        });
    }