1 /*
2 * Licensed to the Apache Software Foundation (ASF) under one
3 * or more contributor license agreements. See the NOTICE file
4 * distributed with this work for additional information
5 * regarding copyright ownership. The ASF licenses this file
6 * to you under the Apache License, Version 2.0 (the
7 * "License"); you may not use this file except in compliance
8 * with the License. You may obtain a copy of the License at
9 *
10 * http://www.apache.org/licenses/LICENSE-2.0
11 *
12 * Unless required by applicable law or agreed to in writing,
13 * software distributed under the License is distributed on an
14 * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
15 * KIND, either express or implied. See the License for the
16 * specific language governing permissions and limitations
17 * under the License.
18 *
19 */
20 package org.apache.mina.filter.query;
21
22 import java.util.Map;
23 import java.util.concurrent.ScheduledFuture;
24
25 import org.apache.mina.api.IoSession;
26 import org.apache.mina.util.AbstractIoFuture;
27
28 /**
29 * A future representing the promise of a reply to a request.
30 *
31 * @author <a href="http://mina.apache.org">Apache MINA Project</a>
32 *
33 * @param <REQUEST> the request type
34 * @param <RESPONSE> the response type
35 */
36 class RequestFuture<REQUEST extends Request, RESPONSE extends Response> extends AbstractIoFuture<RESPONSE> {
37
38 private final IoSession session;
39
40 private final Object id;
41
42 private ScheduledFuture<?> schedFuture;
43
44 public RequestFuture(IoSession session, Object id) {
45 this.session = session;
46 this.id = id;
47 }
48
49 @Override
50 protected boolean cancelOwner(boolean mayInterruptIfRunning) {
51 throw new IllegalStateException("not implemented");
52 }
53
54 void complete(RESPONSE response) {
55 if (schedFuture != null) {
56 schedFuture.cancel(true);
57 }
58 setResult(response);
59 }
60
61 void setTimeoutFuture(ScheduledFuture<?> schedFuture) {
62 this.schedFuture = schedFuture;
63 }
64
65 Runnable timeout = new Runnable() {
66
67 @SuppressWarnings("rawtypes")
68 @Override
69 public void run() {
70 Map inFlight = session.getAttribute(RequestFilter.IN_FLIGHT_REQUESTS);
71 if (inFlight != null) {
72 inFlight.remove(id);
73 }
74 setException(new RequestTimeoutException());
75
76 }
77 };
78 }