/* * 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.deltaspike.core.api.config; /** * <p> * If you implement this interface, the property files with the given file name will be registered as * {@link org.apache.deltaspike.core.spi.config.ConfigSource}s.</p> *<p>There are 2 ways to register a {@code PropertyFileConfig}</p> * * <h3>1. Automatic pickup via {@code ProcessAnnotatedType} phase</h3> * <p> * DeltaSpike will automatically pick up all the implementations which are * inside a Bean Archive (a JAR or ClassPath entry with a META-INF/beans.xml file) during the * {@link javax.enterprise.inject.spi.ProcessAnnotatedType} phase and create a new instance via reflection. Thus the * implementations will need a non-private default constructor. There is <b>no</b> CDI injection being performed in * those instances! The scope of the implementations will also be ignored as they will not get picked up as CDI * beans.</p> * * <p> * Please note that the configuration will only be available after the boot is finished. This means that you cannot use * this configuration inside a CDI Extension before the boot is finished!</p> * * <p><b>Attention:</b> When using this logic inside an EAR then you might get * different behaviour depending on the Java EE * server you are using. Some EE container use a different ClassLoader to bootstrap * the application than later to serve Requests. * In that case we would register the ConfigSources on the <em>wrong</em> ConfigResolver * (means we register it to the wrong ClassLoader). If you did hit such an application server * then you might need to switch back to manually register the * {@link org.apache.deltaspike.core.spi.config.ConfigSource} or * {@link org.apache.deltaspike.core.spi.config.ConfigSourceProvider} via the * {@link java.util.ServiceLoader} mechanism described there.</p>. * * <h3>2. Automatic pickup via {@code java.util.ServiceLoader} mechanism</h3> * <p>In case you have an EAR or you need the configured values already during the CDI container start * then you can also register the PropertyFileConfig via the {@code java.util.ServiceLoader} mechanism. * To not have this configuration picked up twice it is required to annotate your own * {@code PropertyFileConfig} implementation with {@link org.apache.deltaspike.core.api.exclude.Exclude}.</p> * * <p>The {@code ServiceLoader} mechanism requires to have a file * <pre> * META-INF/services/org.apache.deltaspike.core.api.config.PropertyFileConfig * </pre> * containing the fully qualified Class name of your own {@code PropertyFileConfig} implementation class. * <pre> * com.acme.my.own.SomeSpecialPropertyFileConfig * </pre> * The implementation will look like the following: * <pre> * @Exclude * public class SomeSpecialPropertyFileConfig implements PropertyFileConfig { * public String getPropertyFileName() { * return "myconfig/specialconfig.properties" * } * public boolean isOptional() { * return false; * } * } * </pre> * </p> * */ public interface PropertyFileConfig { /** * All the property files on the classpath which have this name will get picked up and registered as * {@link org.apache.deltaspike.core.spi.config.ConfigSource}. * * If the the returned String starts with 'file://' then we pick up the configuration from a file * on the File System instead of the ClassPath. * The same works for other URLs which are passed, e.g. 'http://'. * Note that reading the property values only gets performed once right now. * * @return the full file name (including path) of the property files to pick up. */ String getPropertyFileName(); /** * @return true if the file is optional, false if the specified file has to be in place. */ boolean isOptional(); }