// Copyright 2010-2017 Google
// 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.

import com.google.ortools.sat.DecisionStrategyProto;
import com.google.ortools.sat.SatParameters;
import com.google.ortools.sat.CpModel;
import com.google.ortools.sat.CpSolver;
import com.google.ortools.sat.CpSolverSolutionCallback;
import com.google.ortools.sat.IntVar;

class VarArraySolutionPrinter extends CpSolverSolutionCallback {
  public VarArraySolutionPrinter(IntVar[] variables) {
    variables_ = variables;
  }

  @Override
  public void onSolutionCallback() {
    for (IntVar v : variables_) {
      System.out.print(String.format("%s=%d ", v.getName(), value(v)));
    }
    System.out.println();
  }

  private IntVar[] variables_;
}

public class ChannelingSample {

  static { System.loadLibrary("jniortools"); }

  public static void main(String[] args) throws Exception {
    // Model.
    CpModel model = new CpModel();

    // Variables.
    IntVar x = model.newIntVar(0, 10, "x");
    IntVar y = model.newIntVar(0, 10, "y");

    IntVar b = model.newBoolVar("b");

    // Implement b == (x >= 5).
    model.addGreaterOrEqual(x, 5).onlyEnforceIf(b);
    model.addLessOrEqual(x, 4).onlyEnforceIf(b.not());

    // b implies (y == 10 - x).
    model.addLinearSumEqual(new IntVar[] {x, y}, 10).onlyEnforceIf(b);
    // not(b) implies y == 0.
    model.addEquality(y, 0).onlyEnforceIf(b.not());

    // Search for x values in increasing order.
    model.addDecisionStrategy(
        new IntVar[] {x},
        DecisionStrategyProto.VariableSelectionStrategy.CHOOSE_FIRST,
        DecisionStrategyProto.DomainReductionStrategy.SELECT_MIN_VALUE);

    // Create a solver and solve with a fixed search.
    CpSolver solver = new CpSolver();

    // Force solver to follow the decision strategy exactly.
    solver.getParameters().setSearchBranching(SatParameters.SearchBranching.FIXED_SEARCH);

    VarArraySolutionPrinter cb = new VarArraySolutionPrinter(new IntVar[] {x, y, b});
    solver.searchAllSolutions(model, cb);
  }
}

@@ -855,387 +855,8 @@
 r;%0A%0A
-class VarArraySolutionPrinter extends CpSolverSolutionCallback %7B%0A  public VarArraySolutionPrinter(IntVar%5B%5D variables) %7B%0A    variables_ = variables;%0A  %7D%0A%0A  @Override%0A  public void onSolutionCallback() %7B%0A    for (IntVar v : variables_) %7B%0A      System.out.print(String.format(%22%25s=%25d %22, v.getName(), value(v)));%0A    %7D%0A    System.out.println();%0A  %7D%0A%0A  private IntVar%5B%5D variables_;%0A%7D%0A%0A
 publ
@@ -1204,16 +1204,17 @@
 mplement
+s
  b == (x
@@ -1528,16 +1528,18 @@
 / Search
+es
  for x v
@@ -1779,16 +1779,17 @@
 / Create
+s
  a solve
@@ -1872,16 +1872,17 @@
 // Force
+s
  solver 
@@ -2022,129 +2022,573 @@
     
-VarArraySolutionPrinter cb = new VarArraySolutionPrinter(new IntVar%5B%5D %7Bx, y, b%7D);%0A    solver.searchAllSolutions(model, cb
+// And solves the problem with the printer callback.%0A    solver.searchAllSolutions(model, new CpSolverSolutionCallback() %7B%0A        public CpSolverSolutionCallback init(IntVar%5B%5D variables) %7B%0A          variables_ = variables;%0A          return this;%0A        %7D%0A%0A        @Override%0A        public void onSolutionCallback() %7B%0A          for (IntVar v : variables_) %7B%0A            System.out.print(String.format(%22%25s=%25d %22, v.getName(), value(v)));%0A          %7D%0A          System.out.println();%0A        %7D%0A%0A        private IntVar%5B%5D variables_;%0A      %7D.init(new IntVar%5B%5D %7Bx, y, b%7D)
 );%0A 

use anonymous classes