/**
 * 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.camel.example.cxf.jaxrs.resources;

import java.util.HashMap;
import java.util.Map;

import javax.ws.rs.WebApplicationException;
import javax.ws.rs.core.Response;

public class BookStoreImpl implements BookStore {
    
    private Map<Long, Book> books = new HashMap<Long, Book>();
    private boolean isRest;
    
    public BookStoreImpl(boolean restFlag) {
        isRest = restFlag;
        init();        
    }
    
    public BookStoreImpl() {        
        init();        
    }
    
    public Book getBook(Long id) throws BookNotFoundFault {
        
        if (books.get(id) == null) {
            BookNotFoundDetails details = new BookNotFoundDetails();
            details.setId(id);
            if (!isRest) {
                throw new BookNotFoundFault("Can't find the Book with id " + id, details);
            } else {                
                Response r = Response.status(404).header("BOOK-HEADER",
                    "No Book with id " + id + " is available").entity(details).build();
                throw new WebApplicationException(r);
            }
        }
        
        return books.get(id);
    }
    
    public Book addBook(Book book) {        
        books.put(book.getId(), book);
        return books.get(book.getId());
    }
    
    private void init() {
        Book book = new Book();
        book.setId(123);
        book.setName("CXF in Action");
        books.put(book.getId(), book);
    }    

}
