/* * 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.brooklyn.core.test.entity; import org.apache.brooklyn.config.ConfigKey; import org.apache.brooklyn.core.internal.BrooklynProperties; import org.apache.brooklyn.core.mgmt.internal.LocalManagementContext; import org.apache.brooklyn.core.mgmt.internal.ManagementContextInternal; import org.apache.brooklyn.core.server.BrooklynServerConfig; /** management context which allows disabling common time-consuming tasks. * most instances have: * <li> empty properties * <li> no catalog * <li> persistence off * <li> osgi off * <p> * the constructor, {@link #newInstance()}, and {@link #builder(boolean)} (with true) return the above; * the constructor and the builder allow custom properties to be set, * and the builder allows individual items to be turned back on. */ public class LocalManagementContextForTests extends LocalManagementContext { protected LocalManagementContextForTests(BrooklynProperties brooklynProperties, boolean minimal) { super(builder(minimal).useProperties(brooklynProperties).buildProperties()); } public LocalManagementContextForTests() { this(null); } public LocalManagementContextForTests(BrooklynProperties brooklynProperties) { this(brooklynProperties, true); } private static BrooklynProperties emptyIfNull(BrooklynProperties bp) { if (bp!=null) return bp; return BrooklynProperties.Factory.newEmpty(); } public static BrooklynProperties setEmptyCatalogAsDefault(BrooklynProperties brooklynProperties) { if (brooklynProperties==null) return null; brooklynProperties.putIfAbsent(BrooklynServerConfig.BROOKLYN_CATALOG_URL, ManagementContextInternal.EMPTY_CATALOG_URL); return brooklynProperties; } public static BrooklynProperties disableOsgi(BrooklynProperties brooklynProperties) { if (brooklynProperties==null) return null; setFailingIfConflicting(brooklynProperties, BrooklynServerConfig.USE_OSGI, false); return brooklynProperties; } @SuppressWarnings("deprecation") public static BrooklynProperties disablePersistenceBackups(BrooklynProperties brooklynProperties) { if (brooklynProperties==null) return null; setFailingIfConflicting(brooklynProperties, BrooklynServerConfig.PERSISTENCE_BACKUPS_REQUIRED_ON_DEMOTION, false); setFailingIfConflicting(brooklynProperties, BrooklynServerConfig.PERSISTENCE_BACKUPS_REQUIRED_ON_PROMOTION, false); setFailingIfConflicting(brooklynProperties, BrooklynServerConfig.PERSISTENCE_BACKUPS_REQUIRED, false); return brooklynProperties; } private static <T> void setFailingIfConflicting(BrooklynProperties brooklynProperties, ConfigKey<T> key, T value) { Object old = brooklynProperties.put(key, value); if (old != null && !old.equals(value)) { throw new IllegalStateException("Cannot change value for '" + key + "' from " + old + " to " + value); } } public static class Builder { boolean disablePersistenceBackups = false; boolean disableOsgi = false; boolean emptyCatalog = false; BrooklynProperties properties = null; public Builder disablePersistenceBackups() { return disablePersistenceBackups(true); } public Builder disableOsgi() { return disableOsgi(true); } public Builder emptyCatalog() { return emptyCatalog(true); } public Builder disablePersistenceBackups(boolean disablePersistenceBackups) { this.disablePersistenceBackups = disablePersistenceBackups; return this; } public Builder disableOsgi(boolean disableOsgi) { this.disableOsgi = disableOsgi; return this; } public Builder emptyCatalog(boolean emptyCatalog) { this.emptyCatalog = emptyCatalog; return this; } // for use in the outer class's constructor private Builder minimal(boolean really) { if (really) minimal(); return this; } public Builder minimal() { disablePersistenceBackups(); disableOsgi(); emptyCatalog(); properties = null; return this; } public Builder useProperties(BrooklynProperties properties) { if (this.properties!=null && properties!=null) throw new IllegalStateException("Cannot set multiple properties"); this.properties = properties; return this; } public BrooklynProperties buildProperties() { BrooklynProperties result = emptyIfNull(properties); if (disablePersistenceBackups) LocalManagementContextForTests.disablePersistenceBackups(result); if (disableOsgi) LocalManagementContextForTests.disableOsgi(result); if (emptyCatalog) LocalManagementContextForTests.setEmptyCatalogAsDefault(result); return result; } public LocalManagementContext build() { return new LocalManagementContextForTests(buildProperties(), false); } public Builder useDefaultProperties() { properties = BrooklynProperties.Factory.newDefault(); return this; } } /** Create a new builder, defaulting to empty properties, and with the parameter determining whether * by default to disable common things disabled in tests (and the caller can re-enable selected ones individually) * or (if false) leaving everything enabled (so the caller turns things off) */ public static Builder builder(boolean minimal) { return new Builder().minimal(minimal); } /** Creates a new minimal instance */ public static LocalManagementContext newInstance() { return builder(true).build(); } /** Creates a new minimal instance with the given properties then installed. */ public static LocalManagementContext newInstance(BrooklynProperties properties) { return builder(true).useProperties(properties).build(); } /** Creates a new minimal instance with OSGi then enabled. */ public static LocalManagementContext newInstanceWithOsgi() { return builder(true).disableOsgi(false).build(); } }