/*
 * Licensed to the Apache Software Foundation (ASF) under one
 * or more contributor license agreements.  See the NOTICE file
 * distributed with this work for additional information
 * regarding copyright ownership.  The ASF licenses this file
 * to you under the Apache License, Version 2.0 (the
 * "License"); you may not use this file except in compliance
 * with the License.  You may obtain a copy of the License at
 *
 *     http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

package org.apache.flink.client.program;

import akka.actor.ActorSystem;

import javax.annotation.Nonnull;

/**
 * {@link ActorSystemLoader} which simply returns the given {@link ActorSystem} at
 * construction time.
 */
public class DefaultActorSystemLoader implements ActorSystemLoader {

	@Nonnull
	private final ActorSystem actorSystem;

	public DefaultActorSystemLoader(@Nonnull ActorSystem actorSystem) {
		this.actorSystem = actorSystem;
	}

	@Override
	public ActorSystem get() {
		return actorSystem;
	}

	@Override
	public void close() throws Exception {
		// noop
	}
}
