001/*******************************************************************************
002 * Copyright (c) 2017, 2018 Red Hat Inc
003 * All rights reserved. This program and the accompanying materials
004 * are made available under the terms of the Eclipse Public License v1.0
005 * which accompanies this distribution, and is available at
006 * http://www.eclipse.org/legal/epl-v10.html
007 *
008 * Contributors:
009 *     Jens Reimann - initial API and implementation
010 *******************************************************************************/
011package io.systemd.network;
012
013import static de.dentrassi.varlink.spi.Errors.check;
014import static java.util.Arrays.asList;
015
016import java.util.List;
017import java.util.concurrent.CompletableFuture;
018
019import de.dentrassi.varlink.internal.VarlinkImpl;
020import de.dentrassi.varlink.spi.CallRequest;
021import de.dentrassi.varlink.spi.Connection;
022
023public class NetworkImpl implements Network {
024
025    public static class Factory implements de.dentrassi.varlink.spi.Factory {
026
027        @Override
028        public <T> T create(final VarlinkImpl varlink, final Class<T> clazz, final Connection connection) {
029            return clazz.cast(new NetworkImpl(varlink, connection));
030        }
031
032    }
033
034    private final Connection connection;
035    private final VarlinkImpl varlink;
036
037    private NetworkImpl(final VarlinkImpl varlink, final Connection connection) {
038        this.varlink = varlink;
039        this.connection = connection;
040    }
041
042    @Override
043    public Async async() {
044        return new Async() {
045
046            @Override
047            public CompletableFuture<List<Netdev>> list() {
048                return executeList();
049            }
050        };
051    }
052
053    protected CompletableFuture<List<Netdev>> executeList() {
054        return this.connection.call(CallRequest.of("io.systemd.network.List"))
055                .thenApply(cr -> {
056                    check(cr);
057
058                    return asList(
059                            this.varlink
060                                    .fromJson(
061                                            Netdev[].class,
062                                            cr.getFirstParameter()));
063                });
064    }
065
066}