/**
* 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.isis.applib.services.fixturespec;
import org.apache.isis.applib.annotation.Programmatic;
import org.apache.isis.applib.fixturescripts.FixtureResultList;
import org.apache.isis.applib.fixturescripts.FixtureScript;
import org.apache.isis.applib.fixturescripts.FixtureScripts;
/**
* Pulls together the various state that influences the behaviour of {@link FixtureScripts} service.
*/
public class FixtureScriptsSpecification {
/**
* In Whether to show available {@link FixtureScript}s using a choices or an autocomplete.
*/
public enum DropDownPolicy {
AUTO_COMPLETE,
CHOICES;
public boolean isAutoComplete() {
return this == AUTO_COMPLETE;
}
public boolean isChoices() {
return this == CHOICES;
}
}
/**
* Typically preferable to use the create using the {@link FixtureScriptsSpecification.Builder}
* (obtained from {@link #builder(Class)}).
* @param packagePrefix - to search for fixture script implementations, eg "com.mycompany". Note that this is ignored if an {@link org.apache.isis.applib.AppManifest} is in use.
* @param nonPersistedObjectsStrategy - how to handle any non-persisted objects that are {@link FixtureScripts#newFixtureResult(FixtureScript, String, Object, boolean) added} to a {@link FixtureResultList}.
* @param multipleExecutionStrategy - whether more than one instance of the same fixture script class can be run multiple times
* @param runScriptDefaultScriptClass - the fixture script to provide as a default in {@link FixtureScripts#runFixtureScript(FixtureScript, String)} action.
* @param runScriptDropDownPolicy - whether the {@link FixtureScripts#runFixtureScript(FixtureScript, String)} should use a choices or an autoComplete.
* @param recreateScriptClass - if specified, then make the {@link FixtureScriptsDefault#recreateObjectsAndReturnFirst()} action visible.
*/
public FixtureScriptsSpecification(
final String packagePrefix,
final FixtureScripts.NonPersistedObjectsStrategy nonPersistedObjectsStrategy,
final FixtureScripts.MultipleExecutionStrategy multipleExecutionStrategy,
final Class<? extends FixtureScript> runScriptDefaultScriptClass,
final DropDownPolicy runScriptDropDownPolicy,
final Class<? extends FixtureScript> recreateScriptClass) {
this.packagePrefix = packagePrefix;
this.nonPersistedObjectsStrategy = nonPersistedObjectsStrategy;
this.multipleExecutionStrategy = multipleExecutionStrategy;
this.recreateScriptClass = recreateScriptClass;
this.runScriptDefaultScriptClass = runScriptDefaultScriptClass;
this.dropDownPolicy = runScriptDropDownPolicy;
}
private final String packagePrefix;
private final FixtureScripts.NonPersistedObjectsStrategy nonPersistedObjectsStrategy;
private final FixtureScripts.MultipleExecutionStrategy multipleExecutionStrategy;
private final Class<? extends FixtureScript> recreateScriptClass;
private final Class<? extends FixtureScript> runScriptDefaultScriptClass;
private final DropDownPolicy dropDownPolicy;
/**
* Note that this is ignored if an {@link org.apache.isis.applib.AppManifest} is in use.
*/
@Programmatic
public String getPackagePrefix() {
return packagePrefix;
}
@Programmatic
public FixtureScripts.NonPersistedObjectsStrategy getNonPersistedObjectsStrategy() {
return nonPersistedObjectsStrategy;
}
@Programmatic
public FixtureScripts.MultipleExecutionStrategy getMultipleExecutionStrategy() {
return multipleExecutionStrategy;
}
@Programmatic
public Class<? extends FixtureScript> getRunScriptDefaultScriptClass() {
return runScriptDefaultScriptClass;
}
@Programmatic
public DropDownPolicy getRunScriptDropDownPolicy() {
return dropDownPolicy;
}
@Programmatic
public Class<? extends FixtureScript> getRecreateScriptClass() {
return recreateScriptClass;
}
public static class Builder {
private final String packagePrefix;
private FixtureScripts.NonPersistedObjectsStrategy nonPersistedObjectsStrategy = FixtureScripts.NonPersistedObjectsStrategy.PERSIST;
private FixtureScripts.MultipleExecutionStrategy multipleExecutionStrategy = FixtureScripts.MultipleExecutionStrategy.IGNORE;
private Class<? extends FixtureScript> recreateScriptClass = null;
private Class<? extends FixtureScript> defaultScriptClass = null;
private DropDownPolicy dropDownPolicy = DropDownPolicy.CHOICES;
public Builder(final Class<?> contextClass) {
this(contextClass.getPackage().getName());
}
public Builder(final String packagePrefix) {
this.packagePrefix = packagePrefix;
}
public Builder with(FixtureScripts.NonPersistedObjectsStrategy nonPersistedObjectsStrategy) {
this.nonPersistedObjectsStrategy = nonPersistedObjectsStrategy;
return this;
}
public Builder with(FixtureScripts.MultipleExecutionStrategy multipleExecutionStrategy) {
this.multipleExecutionStrategy = multipleExecutionStrategy;
return this;
}
public Builder withRecreate(Class<? extends FixtureScript> recreateScriptClass) {
this.recreateScriptClass = recreateScriptClass;
return this;
}
public Builder withRunScriptDefault(Class<? extends FixtureScript> defaultScriptClass) {
this.defaultScriptClass = defaultScriptClass;
return this;
}
public Builder withRunScriptDropDown(DropDownPolicy dropDownPolicy) {
this.dropDownPolicy = dropDownPolicy;
return this;
}
public FixtureScriptsSpecification build() {
return new FixtureScriptsSpecification(
packagePrefix,
nonPersistedObjectsStrategy, multipleExecutionStrategy,
defaultScriptClass, dropDownPolicy, recreateScriptClass
);
}
}
public static Builder builder(final Class<?> contextClass) {
return new Builder(contextClass);
}
public static Builder builder(final String packagePrefix) {
return new Builder(packagePrefix);
}
}