/*
 *
 *   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.dubbo.samples.resilience4j.impl;

import org.apache.dubbo.config.annotation.DubboService;
import org.apache.dubbo.samples.resilience4j.api.CircuitBreakerService;

import java.util.concurrent.atomic.AtomicLong;

@DubboService(interfaceClass = CircuitBreakerService.class)
public class CircuitBreakerServiceImpl implements CircuitBreakerService {
    private AtomicLong count = new AtomicLong(0);

    @Override
    public String say(String name) {
        long countLong = count.incrementAndGet();
        if (name.startsWith("half") && countLong % 20 < 18) {
            return "Hello " + name + " - " + countLong;
        } else if (name.startsWith("off")) {
            return "Hello " + name + " - " + countLong;
        }
        throw new RuntimeException("Exception to show resilience enabled." + name);
    }
}
