/*
 * Copyright 2009-2010 by The Regents of the University of California
 * Licensed 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 from
 * 
 *     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 edu.uci.ics.hyracks.api.client;

import java.io.Serializable;

public class ClusterControllerInfo implements Serializable {
    private static final long serialVersionUID = 1L;

    private final String clientNetAddress;

    private final int clientNetPort;

    private final int webPort;

    public ClusterControllerInfo(String clientNetAddress, int clientNetPort, int webPort) {
        this.clientNetAddress = clientNetAddress;
        this.clientNetPort = clientNetPort;
        this.webPort = webPort;
    }

    public int getWebPort() {
        return webPort;
    }

    public String getClientNetAddress() {
        return clientNetAddress;
    }

    public int getClientNetPort() {
        return clientNetPort;
    }
}