/*
* Copyright 2015 Red Hat, Inc. and/or its affiliates.
*
* Licensed 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.optaplanner.core.impl.testdata.domain.shadow.manytomany;
import org.optaplanner.core.api.domain.entity.PlanningEntity;
import org.optaplanner.core.api.domain.variable.CustomShadowVariable;
import org.optaplanner.core.api.domain.variable.PlanningVariable;
import org.optaplanner.core.api.domain.variable.PlanningVariableReference;
import org.optaplanner.core.impl.domain.entity.descriptor.EntityDescriptor;
import org.optaplanner.core.impl.domain.solution.descriptor.SolutionDescriptor;
import org.optaplanner.core.impl.domain.variable.listener.VariableListenerAdapter;
import org.optaplanner.core.impl.score.director.ScoreDirector;
import org.optaplanner.core.impl.testdata.domain.TestdataObject;
import org.optaplanner.core.impl.testdata.domain.TestdataValue;
@PlanningEntity
public class TestdataManyToManyShadowedEntity extends TestdataObject {
public static EntityDescriptor buildEntityDescriptor() {
SolutionDescriptor solutionDescriptor = TestdataManyToManyShadowedSolution.buildSolutionDescriptor();
return solutionDescriptor.findEntityDescriptorOrFail(TestdataManyToManyShadowedEntity.class);
}
private TestdataValue primaryValue;
private TestdataValue secondaryValue;
private String composedCode;
private String reverseComposedCode;
public TestdataManyToManyShadowedEntity() {
}
public TestdataManyToManyShadowedEntity(String code) {
super(code);
}
public TestdataManyToManyShadowedEntity(String code, TestdataValue primaryValue, TestdataValue secondaryValue) {
this(code);
this.primaryValue = primaryValue;
this.secondaryValue = secondaryValue;
}
@PlanningVariable(valueRangeProviderRefs = "valueRange")
public TestdataValue getPrimaryValue() {
return primaryValue;
}
public void setPrimaryValue(TestdataValue primaryValue) {
this.primaryValue = primaryValue;
}
@PlanningVariable(valueRangeProviderRefs = "valueRange")
public TestdataValue getSecondaryValue() {
return secondaryValue;
}
public void setSecondaryValue(TestdataValue secondaryValue) {
this.secondaryValue = secondaryValue;
}
@CustomShadowVariable(variableListenerClass = ComposedValuesUpdatingVariableListener.class,
sources = {@PlanningVariableReference(variableName = "primaryValue"),
@PlanningVariableReference(variableName = "secondaryValue")})
public String getComposedCode() {
return composedCode;
}
public void setComposedCode(String composedCode) {
this.composedCode = composedCode;
}
@CustomShadowVariable(variableListenerRef = @PlanningVariableReference(variableName = "composedCode"))
public String getReverseComposedCode() {
return reverseComposedCode;
}
public void setReverseComposedCode(String reverseComposedCode) {
this.reverseComposedCode = reverseComposedCode;
}
// ************************************************************************
// Complex methods
// ************************************************************************
// ************************************************************************
// Static inner classes
// ************************************************************************
public static class ComposedValuesUpdatingVariableListener extends VariableListenerAdapter<TestdataManyToManyShadowedEntity> {
@Override
public void afterEntityAdded(ScoreDirector scoreDirector, TestdataManyToManyShadowedEntity entity) {
updateShadow(entity, scoreDirector);
}
@Override
public void afterVariableChanged(ScoreDirector scoreDirector, TestdataManyToManyShadowedEntity entity) {
updateShadow(entity, scoreDirector);
}
private void updateShadow(TestdataManyToManyShadowedEntity entity, ScoreDirector scoreDirector) {
TestdataValue primaryValue = entity.getPrimaryValue();
TestdataValue secondaryValue = entity.getSecondaryValue();
String composedValue;
String reverseComposedValue;
if (primaryValue == null || secondaryValue == null) {
composedValue = null;
reverseComposedValue = null;
} else {
composedValue = primaryValue.getCode() + "-" + secondaryValue.getCode();
reverseComposedValue = secondaryValue.getCode() + "-" + primaryValue.getCode();
}
scoreDirector.beforeVariableChanged(entity, "composedCode");
entity.setComposedCode(composedValue);
scoreDirector.afterVariableChanged(entity, "composedCode");
scoreDirector.beforeVariableChanged(entity, "reverseComposedCode");
entity.setReverseComposedCode(reverseComposedValue);
scoreDirector.afterVariableChanged(entity, "reverseComposedCode");
}
}
}