///////////////////////////////////////////////////////////////
 * 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.
///////////////////////////////////////////////////////////////

[[tut-services-step3,Step 3 - Reading the Service Configuration]]
= Step 3 - Reading the Service Configuration =

Services typically have configuration. Configurations are directly supported in Zest™. A
ConfigurationComposite is a subtype of EntityComposite. That is because
configurations are stored in EntityStores, can be modified in runtime by client code and has
the same semantics as regular entities.

Zest™ also handles the bootstrapping of configuration for the services. If the ConfigurationComposite is
not found in the configured entity store, then Zest™ will automatically locate a properties file for each
service instance, read those properties into a ConfigurationComposite instance, save that to the
entity store and provide the values to the service. The properties file must be with the same name as
the service instance with the extension "properties" in the same package as the service.

For this exercise, create a LibraryConfiguration that contains "titles", "authors" and "copies".
The first two are a string with a comma separated list, and the "copies" is just an Integer with how many
copies are made of each title.

Steps to do.

- Create a LibraryConfiguration interface that extends ConfigurationComposite, and has three Property instances named "titles", "authors" and "copies", where the first two are of String type and the last is of Integer type.
- Delete the LibraryActivator and remove the @Activators annotation from the LibraryService and the corresponding createInitialData method.
- In the LibraryMixin remove the member injection of the ValueBuilderFactory, and instead inject the ValueBuilderFactory in the constructor.
- Inject the LibraryConfiguration via the constructor. The injection scope is @This.
- Create a resource called LibraryService.properties and place it in the directory org/qi4j/tutorials/services/step4 in the classpath (for instance, src/main/resources ). Put something like this in:
    titles=Domain Driven Design, Pragmatic Programmer, Extreme Programming Explained
    authors=Eric Evans, Andy Hunt, Kent Beck
    #Number of copies of each book.
    copies=3
- Load initial data from the LibraryConfiguration in the LibraryMixin constructor.
