/*

   Derby - Class module-info

   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.

 */

/**
 * Template for the module descriptor generated
 * for each localization jar file. The localization
 * packages are declared "open" (for reflective use)
 * so that the shared module can see their message files
 * when looking up message ids.
 */
module org.apache.derby.locale_@LOCALE@
{
    //
    // MANDATORY IMPORTS
    //
    requires java.base;

    requires org.apache.derby.commons;

    //
    // PUBLIC API
    //
    // Allow resource lookup via reflection
    opens org.apache.derby.info.locale_@LOCALE@;
    opens org.apache.derby.loc.locale_@LOCALE@;
    opens org.apache.derby.loc.tools.locale_@LOCALE@;

    //
    // SUPPORT MODULE LOOKUP
    //
    provides org.apache.derby.shared.api.DerbyModuleAPI
        with org.apache.derby.info.locale_@LOCALE@.DerbyModule;
}
