/*
 * 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.sling.discovery.impl.common.resource;

import java.util.Collections;
import java.util.Comparator;
import java.util.Iterator;
import java.util.LinkedList;
import java.util.List;

import org.apache.sling.api.resource.Resource;
import org.apache.sling.api.resource.ValueMap;
import org.apache.sling.discovery.InstanceDescription;
import org.apache.sling.discovery.commons.providers.spi.LocalClusterView;
import org.apache.sling.discovery.impl.Config;
import org.apache.sling.discovery.impl.common.View;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

/**
 * A ClusterView which represents an established view and contains all members
 * as stored in the repository at the according location
 *
 */
public class EstablishedClusterView extends LocalClusterView {

    /**
     * use static logger to avoid frequent initialization as is potentially the
     * case with ClusterViewResource.
     **/
    private final static Logger logger = LoggerFactory
            .getLogger(EstablishedClusterView.class);

    /** Construct a new established cluster view **/
    public EstablishedClusterView(final Config config, final View view,
            final String localId) {
        super(view.getViewId(), view.getResource().getName());

        final Resource viewRes = view.getResource();
        if (viewRes == null) {
            throw new IllegalStateException("viewRes must not be null");
        }
        final ValueMap valueMap = viewRes.adaptTo(ValueMap.class);
        if (valueMap == null) {
            throw new IllegalStateException("valueMap must not be null");
        }
        String leaderId = valueMap.get("leaderId", String.class);
        final Resource members = viewRes.getChild("members");
        if (members == null) {
            throw new IllegalStateException("members must not be null");
        }
        final Iterator<Resource> it1 = members
                .getChildren().iterator();
        final List<Resource> instanceRess = new LinkedList<Resource>();
        while (it1.hasNext()) {
            instanceRess.add(it1.next());
        }

        Collections.sort(instanceRess, new Comparator<Resource>() {
            public int compare(Resource o1, Resource o2) {
                if (o1 == o2) {
                    return 0;
                }
                if (o1 == null) {
                    return 1;
                }
                if (o2 == null) {
                    return -1;
                }
                return o1.getName().compareTo(o2.getName());
            }
        });

        if (leaderId==null || leaderId.length()==0) {
        	// fallback to pre-SLING-3253: choose leader based on slingId alone.
	        final Resource leader = instanceRess.get(0);
	        leaderId = leader.getName();
        }
        InstanceDescription leaderInstance = null;

        for (Iterator<Resource> it2 = instanceRess.iterator(); it2.hasNext();) {
            Resource resource = it2.next();
            Resource instanceResource = resource.getResourceResolver()
                    .getResource(
                            config.getClusterInstancesPath() + "/"
                                    + resource.getName());
            String slingId = resource.getName();
            EstablishedInstanceDescription instance = new EstablishedInstanceDescription(
                    this, instanceResource, slingId, slingId.equals(leaderId),
                    slingId.equals(localId));
            if (instance.isLeader()) {
                if (leaderInstance != null) {
                    logger.error("More than one instance chosen as leader! overwritten leader="
                            + leaderInstance + ", new leader=" + instance);
                }
                leaderInstance = instance;
            }
        }
    }

}
