001/*
002    Licensed to the Apache Software Foundation (ASF) under one
003    or more contributor license agreements.  See the NOTICE file
004    distributed with this work for additional information
005    regarding copyright ownership.  The ASF licenses this file
006    to you under the Apache License, Version 2.0 (the
007    "License"); you may not use this file except in compliance
008    with the License.  You may obtain a copy of the License at
009
010       http://www.apache.org/licenses/LICENSE-2.0
011
012    Unless required by applicable law or agreed to in writing,
013    software distributed under the License is distributed on an
014    "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
015    KIND, either express or implied.  See the License for the
016    specific language governing permissions and limitations
017    under the License.
018 */
019package org.apache.wiki.api.spi;
020
021import org.apache.wiki.util.PropertyReader;
022import org.apache.wiki.util.TextUtil;
023
024import javax.servlet.ServletContext;
025import java.nio.file.ProviderNotFoundException;
026import java.util.Properties;
027import java.util.ServiceLoader;
028
029
030public class Wiki {
031
032    private static final String PROP_PROVIDER_IMPL_ACLS = "jspwiki.provider.impl.acls";
033    private static final String PROP_PROVIDER_IMPL_CONTENTS = "jspwiki.provider.impl.contents";
034    private static final String PROP_PROVIDER_IMPL_CONTEXT = "jspwiki.provider.impl.context";
035    private static final String PROP_PROVIDER_IMPL_ENGINE = "jspwiki.provider.impl.engine";
036    private static final String PROP_PROVIDER_IMPL_SESSION = "jspwiki.provider.impl.session";
037    private static final String DEFAULT_PROVIDER_IMPL_ACLS = "org.apache.wiki.spi.AclsSPIDefaultImpl";
038    private static final String DEFAULT_PROVIDER_IMPL_CONTENTS = "org.apache.wiki.spi.ContentsSPIDefaultImpl";
039    private static final String DEFAULT_PROVIDER_IMPL_CONTEXT = "org.apache.wiki.spi.ContextSPIDefaultImpl";
040    private static final String DEFAULT_PROVIDER_IMPL_ENGINE = "org.apache.wiki.spi.EngineSPIDefaultImpl";
041    private static final String DEFAULT_PROVIDER_IMPL_SESSION = "org.apache.wiki.spi.SessionSPIDefaultImpl";
042
043    // default values
044    private static Properties properties = PropertyReader.getDefaultProperties();
045    private static AclsSPI aclsSPI = getSPI( AclsSPI.class, properties, PROP_PROVIDER_IMPL_ACLS, DEFAULT_PROVIDER_IMPL_ACLS );
046    private static ContentsSPI contentsSPI = getSPI( ContentsSPI.class, properties, PROP_PROVIDER_IMPL_CONTENTS, DEFAULT_PROVIDER_IMPL_CONTENTS );
047    private static ContextSPI contextSPI = getSPI( ContextSPI.class, properties, PROP_PROVIDER_IMPL_CONTEXT, DEFAULT_PROVIDER_IMPL_CONTEXT );
048    private static EngineSPI engineSPI = getSPI( EngineSPI.class, properties, PROP_PROVIDER_IMPL_ENGINE, DEFAULT_PROVIDER_IMPL_ENGINE );
049    private static SessionSPI sessionSPI = getSPI( SessionSPI.class, properties, PROP_PROVIDER_IMPL_SESSION, DEFAULT_PROVIDER_IMPL_SESSION );
050
051    public static Properties init( final ServletContext context ) {
052        properties = PropertyReader.loadWebAppProps( context );
053        aclsSPI = getSPI( AclsSPI.class, properties, PROP_PROVIDER_IMPL_ACLS, DEFAULT_PROVIDER_IMPL_ACLS );
054        contentsSPI = getSPI( ContentsSPI.class, properties, PROP_PROVIDER_IMPL_CONTENTS, DEFAULT_PROVIDER_IMPL_CONTENTS );
055        contextSPI = getSPI( ContextSPI.class, properties, PROP_PROVIDER_IMPL_CONTEXT, DEFAULT_PROVIDER_IMPL_CONTEXT );
056        engineSPI = getSPI( EngineSPI.class, properties, PROP_PROVIDER_IMPL_ENGINE, DEFAULT_PROVIDER_IMPL_ENGINE );
057        sessionSPI = getSPI( SessionSPI.class, properties, PROP_PROVIDER_IMPL_SESSION, DEFAULT_PROVIDER_IMPL_SESSION );
058        return properties;
059    }
060
061    /**
062     * Access to {@link AclsSPI} operations.
063     *
064     * @return {@link AclsSPI} operations.
065     */
066    public static AclsDSL acls() {
067        return new AclsDSL( aclsSPI );
068    }
069
070    /**
071     * Access to {@link ContentsSPI} operations.
072     *
073     * @return {@link ContentsSPI} operations.
074     */
075    public static ContentsDSL contents() {
076        return new ContentsDSL( contentsSPI );
077    }
078
079    /**
080     * Access to {@link ContextSPI} operations.
081     *
082     * @return {@link ContextSPI} operations.
083     */
084    public static ContextDSL context() {
085        return new ContextDSL( contextSPI );
086    }
087
088    /**
089     * Access to {@link EngineSPI} operations.
090     *
091     * @return {@link EngineSPI} operations.
092     */
093    public static EngineDSL engine() {
094        return new EngineDSL( engineSPI );
095    }
096
097    /**
098     * Access to {@link SessionSPI} operations.
099     *
100     * @return {@link SessionSPI} operations.
101     */
102    public static SessionDSL session() {
103        return new SessionDSL( sessionSPI );
104    }
105
106    static < SPI > SPI getSPI( final Class< SPI > spi, final Properties props, final String prop, final String defValue ) {
107        final String providerImpl = TextUtil.getStringProperty( props, prop, defValue );
108        final ServiceLoader< SPI > loader = ServiceLoader.load( spi );
109        for( final SPI provider : loader ) {
110            if( providerImpl.equals( provider.getClass().getName() ) ) {
111                return provider;
112            }
113        }
114        throw new ProviderNotFoundException( spi.getName() + " provider not found" );
115    }
116
117}