/*
* 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 java.util.List;
import javax.annotation.PostConstruct;
import org.apache.isis.applib.annotation.Action;
import org.apache.isis.applib.annotation.ActionLayout;
import org.apache.isis.applib.annotation.DomainServiceLayout;
import org.apache.isis.applib.annotation.MemberOrder;
import org.apache.isis.applib.annotation.MinLength;
import org.apache.isis.applib.annotation.Optionality;
import org.apache.isis.applib.annotation.Parameter;
import org.apache.isis.applib.annotation.ParameterLayout;
import org.apache.isis.applib.annotation.RestrictTo;
import org.apache.isis.applib.events.system.FixturesInstalledEvent;
import org.apache.isis.applib.events.system.FixturesInstallingEvent;
import org.apache.isis.applib.fixturescripts.FixtureResult;
import org.apache.isis.applib.fixturescripts.FixtureScript;
import org.apache.isis.applib.fixturescripts.FixtureScripts;
import org.apache.isis.applib.services.eventbus.EventBusService;
/**
* Default instance of {@link FixtureScripts}, instantiated automatically by the framework if no custom user-defined instance was
* registered.
*
* <p>
* The original design (pre 1.9.0) was to subclass {@link FixtureScripts} and specify the package prefix (and optionally other
* settings) to search for {@link FixtureScript} subtypes. The inherited functionality from the superclass then knew how to
* find and execute fixture scripts.
* </p>
* <p>
* The new (1.9.0+) design separates these responsibilities. Rather than subclassing {@link FixtureScripts}, you can instead
* rely on the framework to instantiate <i>this</i> default, fallback, implementation of {@link FixtureScripts}. You can then
* optionally (though typically) specify the package prefix and other settings by implementing the new {@link FixtureScriptsSpecificationProvider}
* service.
* </p>
*
* <p>
* Note that this class is deliberately <i>not</i> annotated with {@link org.apache.isis.applib.annotation.DomainService}; rather it is
* automatically registered programmatically if no other instance of {@link FixtureScripts} is found.
* </p>
*/
@DomainServiceLayout(
named="Prototyping",
menuBar = DomainServiceLayout.MenuBar.SECONDARY,
menuOrder = "500.10"
)
public class FixtureScriptsDefault extends FixtureScripts {
//region > constructor, init
/**
* The package prefix to search for fixture scripts. This default value will result in
* no fixture scripts being found. However, normally it will be overridden.
*/
public static final String PACKAGE_PREFIX = FixtureScriptsDefault.class.getPackage().getName();
public FixtureScriptsDefault() {
super(PACKAGE_PREFIX);
}
@PostConstruct
public void init() {
if(fixtureScriptsSpecificationProvider == null) {
return;
}
setSpecification(fixtureScriptsSpecificationProvider.getSpecification());
}
//endregion
//region > runFixtureScript (using choices as the drop-down policy)
@Action(
restrictTo = RestrictTo.PROTOTYPING
)
@MemberOrder(sequence="10")
@Override
public List<FixtureResult> runFixtureScript(
final FixtureScript fixtureScript,
@ParameterLayout(
named = "Parameters",
describedAs =
"Script-specific parameters (if any). The format depends on the script implementation (eg key=value, CSV, JSON, XML etc)",
multiLine = 10)
@Parameter(optionality = Optionality.OPTIONAL)
final String parameters) {
try {
eventBusService.post(new FixturesInstallingEvent(this));
return super.runFixtureScript(fixtureScript, parameters);
} finally {
eventBusService.post(new FixturesInstalledEvent(this));
}
}
/**
* Hide the actions of this service if no configuring {@link FixtureScriptsSpecificationProvider} was provided or is available.
*/
public boolean hideRunFixtureScript() {
return hideIfPolicyNot(FixtureScriptsSpecification.DropDownPolicy.CHOICES);
}
@Override
public String disableRunFixtureScript() {
return super.disableRunFixtureScript();
}
@Override
public FixtureScript default0RunFixtureScript() {
Class<? extends FixtureScript> defaultScript = getSpecification().getRunScriptDefaultScriptClass();
if(defaultScript == null) {
return null;
}
return findFixtureScriptFor(defaultScript);
}
/**
* Promote to public visibility.
*/
@Override
public List<FixtureScript> choices0RunFixtureScript() {
return super.choices0RunFixtureScript();
}
@Override
public String validateRunFixtureScript(final FixtureScript fixtureScript, final String parameters) {
return super.validateRunFixtureScript(fixtureScript, parameters);
}
//endregion
//region > runFixtureScript (using autoComplete as drop-down policy)
@Action(
restrictTo = RestrictTo.PROTOTYPING
)
@ActionLayout(
named = "Run Fixture Script"
)
@MemberOrder(sequence="10")
public List<FixtureResult> runFixtureScriptWithAutoComplete(
final FixtureScript fixtureScript,
@ParameterLayout(
named = "Parameters",
describedAs =
"Script-specific parameters (if any). The format depends on the script implementation (eg key=value, CSV, JSON, XML etc)",
multiLine = 10)
@Parameter(optionality = Optionality.OPTIONAL)
final String parameters) {
return this.runFixtureScript(fixtureScript, parameters);
}
public boolean hideRunFixtureScriptWithAutoComplete() {
return hideIfPolicyNot(FixtureScriptsSpecification.DropDownPolicy.AUTO_COMPLETE);
}
public String disableRunFixtureScriptWithAutoComplete() {
return disableRunFixtureScript();
}
public FixtureScript default0RunFixtureScriptWithAutoComplete() {
return default0RunFixtureScript();
}
public List<FixtureScript> autoComplete0RunFixtureScriptWithAutoComplete(final @MinLength(1) String arg) {
return autoComplete0RunFixtureScript(arg);
}
public String validateRunFixtureScriptWithAutoComplete(final FixtureScript fixtureScript, final String parameters) {
return super.validateRunFixtureScript(fixtureScript, parameters);
}
//endregion
//region > recreateObjectsAndReturnFirst
@Action(
restrictTo = RestrictTo.PROTOTYPING
)
@ActionLayout(
cssClassFa="fa fa-refresh"
)
@MemberOrder(sequence="20")
public Object recreateObjectsAndReturnFirst() {
Class<? extends FixtureScript> recreateScriptClass = getSpecification().getRecreateScriptClass();
final FixtureScript recreateScript = findFixtureScriptFor(recreateScriptClass);
if(recreateScript == null) {
return null;
}
final List<FixtureResult> results = recreateScript.run(null);
if(results.isEmpty()) {
return null;
}
return results.get(0).getObject();
}
public boolean hideRecreateObjectsAndReturnFirst() {
return getSpecification().getRecreateScriptClass() == null;
}
//endregion
//region > helpers
private boolean hideIfPolicyNot(final FixtureScriptsSpecification.DropDownPolicy requiredPolicy) {
return fixtureScriptsSpecificationProvider == null || getSpecification().getRunScriptDropDownPolicy() != requiredPolicy;
}
//endregion
//region > injected services
@javax.inject.Inject
FixtureScriptsSpecificationProvider fixtureScriptsSpecificationProvider;
@javax.inject.Inject
EventBusService eventBusService;
//endregion
}