No preparations added to this decorator and can not fetch response

Hello
I create graph manually.
when i want to send the request for routing between source and destination by this
GHRequest rq = new GHRequest().
addPoint(new GHPoint(31.908780440983815, 54.37255319069316))
.addPoint(new GHPoint(31.897887095816365, 54.364399275287546)).
setVehicle(“car”).
setLocale(“fa”).
setAlgorithm(Parameters.Algorithms.DIJKSTRA);

, in "getDecoratedAlgorithmFactory" i receive this exception:
Exception in thread "main" java.lang.IllegalStateException: No preparations added to this decorator.

i debug my code but i can not understand where i set “preparations” or which function must set this parameter.

Please help me why this occur.
Thanks in advance.

I create graph manually.

Either have a look into the tests or GraphHopper class on how to do this or we need the details on how you do this

I fallow below steps to create graph as like as shape reader:
1- fetch the data from database and store them in ResultSet
2- read line by line and process every lineString or multilineString record in database:

HashSet tmpSet = new HashSet<>();
for(Postgre p : dataStore){
Geometry geometry;
try {
geometry = wktReader.read(p.getGeom());
geometry.setSRID(4326);
for (Coordinate[] points : getCoords(geometry)) {

                    tmpSet.clear();
                    for (int i = 0; i < points.length; i++) {
                        Coordinate c = points[i];

                        // don't add the same coord twice for the same edge - happens with bad geometry, i.e.
                        // duplicate coords or a road which forms a circle (e.g. roundabout)
                        if (tmpSet.contains(c))
                            continue;

                        tmpSet.add(c);

                        // skip if its already a node
                        int state = coordState.get(c);
                        if (state >= FIRST_NODE_ID) {
                            continue;
                        }

                        if (i == 0 || i == points.length - 1 || state == COORD_STATE_PILLAR) {
                            // turn into a node if its the first or last
                            // point, or already appeared in another edge
                            int nodeId = nextNodeId++;
                            coordState.put(c, nodeId);
                            saveTowerPosition(nodeId, c);
                        } else if (state == COORD_STATE_UNKNOWN) {
                            // mark it as a pillar (which may get upgraded
                            // to an edge later)
                            coordState.put(c, COORD_STATE_PILLAR);
                        }
                    }
                }
            }catch (Exception e)
            {
                e.printStackTrace();

            }


        }
    } catch (Exception e) {
        System.out.println("SOMETHING PROBLEMS!!!!");
        e.printStackTrace();
    }

    if (nextNodeId == FIRST_NODE_ID)
        throw new IllegalArgumentException("No data found for roads file ");

    LOGGER.info("Number of junction points : " + (nextNodeId - FIRST_NODE_ID));
}

3- then ProcessRoad like shape reader .
4- calling addEdge method in process road :
public static interface EdgeAddedListener {
void edgeAdded(ReaderWay way, EdgeIteratorState edge);
}
private void addEdge(int fromTower, int toTower, Postgre road, double distance,
GHPoint estmCentre, PointList pillarNodes) {
EdgeIteratorState edge = graph.edge(fromTower, toTower);
// read the OSM id, should never be null
long id = road.getOsm_id();

    // Make a temporary ReaderWay object with the properties we need so we
    // can use the enocding manager
    // We (hopefully don't need the node structure on here as we're only
    // calling the flag
    // encoders, which don't use this...
    ReaderWay way = new ReaderWay(id);

    way.setTag("estimated_distance", distance);
    way.setTag("estimated_center", estmCentre);

    // read the highway type
    Object type = road.getHighway();
    Object junction = road.getJunction();
    Boolean tunnel =  road.getTunnel();
    Boolean bridge = road.getBridge();
    if (type != null) {
        way.setTag("highway", type.toString());
    }
    if (junction != null) {
        way.setTag("junction", junction.toString());
    }
    if (tunnel != null && tunnel == false) {
        way.setTag("tunnel", "no");
    } else if (tunnel != null && tunnel == true) {
        way.setTag("tunnel", "yes");

    }
    if (bridge != null && bridge == false) {
        way.setTag("bridge", "no");
    } else if (bridge != null && bridge == true) {
        way.setTag("bridge", "yes");

    }

    // read maxspeed filtering for 0 which for Geofabrik shapefiles appears
    // to correspond to no tag
    Object maxSpeed = road.getMaxspeed();
    if (maxSpeed != null && !maxSpeed.toString().trim().equals("0")) {
        way.setTag("maxspeed", maxSpeed.toString());
    }

    for (String tag : DIRECT_COPY_TAGS) {
        Object val= null;
        if(tag == "name")
            val=  road.getName();
        if(tag == "highway")
            val=  road.getHighway();
        if(tag == "junction")
            val=  road.getJunction();
        if(tag == "tunnel")
            val=  road.getTunnel();
        if(tag == "bridge")
            val=  road.getBridge();
        if(tag == "maxspeed")
            val=  road.getMaxspeed();
        if(tag == "oneway")
            val=  road.getOneway();

        if (val != null) {
            way.setTag(tag, val.toString());
        }
    }

    // read oneway
    Object oneway = road.getOneway();
    if (oneway != null) {
        // Geofabrik is using an odd convention for oneway field in
        // shapefile.
        // We map back to the standard convention so that tag can be dealt
        // with correctly by the flag encoder.
        String val = oneway.toString().trim().toLowerCase();
        if (val.equals("b")) {
            // both ways
            val = "no";
        } else if (val.equals("t")) {
            // one way against the direction of digitisation
            val = "-1";
        } else if (val.equals("f")) {
            // one way Forward in the direction of digitisation
            val = "yes";
        } else {
            throw new RuntimeException("Unrecognised value of oneway field \"" + val
                    + "\" found in road with OSM id " + id);
        }

        way.setTag("oneway", val);
    }

    // Process the flags using the encoders
    long includeWay = encodingManager.acceptWay(way);
    if (includeWay == 0) {
        return;
    }

    // TODO we're not using the relation flags
    long relationFlags = 0;

    long wayFlags = encodingManager.handleWayTags(way, includeWay, relationFlags);
    if (wayFlags == 0)
        return;

    edge.setDistance(distance);
    edge.setFlags(wayFlags);
    edge.setWayGeometry(pillarNodes);
    edge.setName(road.getName());
    System.out.println("add edge");


    if (edgeAddedListeners.size() > 0) {

// check size first so we only allocate the iterator if we have
// // listeners
for (EdgeAddedListener l : edgeAddedListeners) {
l.edgeAdded(way, edge);
}
}

} 

after create the graph by these steps, sending request by defining source and destination.

i hope my explanation is enough :slight_smile:

thanks for your attention.