/* * 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 domainapp.application.manifest; import java.io.IOException; import java.io.InputStream; import java.util.Arrays; import java.util.Collections; import java.util.List; import java.util.Map; import java.util.Properties; import com.google.common.collect.Lists; import com.google.common.collect.Maps; import org.apache.isis.applib.AppManifest; import org.apache.isis.applib.fixturescripts.FixtureScript; import domainapp.application.fixture.DomainAppApplicationModuleFixtureSubmodule; import domainapp.application.services.DomainAppApplicationModuleServicesSubmodule; import domainapp.modules.simple.dom.SimpleModuleDomSubmodule; /** * Bootstrap the application. */ public class DomainAppAppManifest implements AppManifest { private final List<Class<? extends FixtureScript>> fixtureScripts; private final String authMechanism; private final List<Class<?>> additionalModules; public DomainAppAppManifest() { this( Collections.<Class<? extends FixtureScript>>emptyList(), null, Collections.<Class<?>>emptyList() ); } public DomainAppAppManifest( final List<Class<? extends FixtureScript>> fixtureScripts, final String authMechanism, final List<Class<?>> additionalModules) { this.fixtureScripts = elseEmptyIfNull(fixtureScripts); this.authMechanism = authMechanism != null ? authMechanism : "shiro"; this.additionalModules = elseEmptyIfNull(additionalModules); } private static <T> List<T> elseEmptyIfNull(final List<T> list) { return list == null ? Collections.<T>emptyList() : list; } /** * Load all services and entities found in (the packages and subpackages within) these modules */ @Override public List<Class<?>> getModules() { List<Class<?>> modules = Lists.newArrayList(); modules.addAll(Arrays.asList( SimpleModuleDomSubmodule.class, DomainAppApplicationModuleFixtureSubmodule.class, DomainAppApplicationModuleServicesSubmodule.class )); modules.addAll(additionalModules); return modules; } /** * No additional services. */ @Override public List<Class<?>> getAdditionalServices() { return Collections.emptyList(); } /** * Use shiro for authentication. */ @Override public String getAuthenticationMechanism() { return authMechanism; } /** * Use shiro for authorization. */ @Override public String getAuthorizationMechanism() { return authMechanism; } /** * No fixtures. */ @Override public List<Class<? extends FixtureScript>> getFixtures() { return fixtureScripts; } /** * No overrides. */ @Override public Map<String, String> getConfigurationProperties() { final Map<String, String> props = Maps.newHashMap(); loadPropsInto(props, "isis.properties"); if(!fixtureScripts.isEmpty()) { props.put("isis.persistor.datanucleus.install-fixtures", "true"); } return props; } static void loadPropsInto(final Map<String, String> props, final String propertiesFile) { final Properties properties = new Properties(); try { try (final InputStream stream = DomainAppAppManifest.class.getResourceAsStream(propertiesFile)) { properties.load(stream); for (Object key : properties.keySet()) { final Object value = properties.get(key); if(key instanceof String && value instanceof String) { props.put((String)key, (String)value); } } } } catch (IOException e) { throw new RuntimeException( String.format("Failed to load '%s' file ", propertiesFile), e); } } }