1 /*
2  *  Licensed to the Apache Software Foundation (ASF) under one or more
3  *  contributor license agreements.  See the NOTICE file distributed with
4  *  this work for additional information regarding copyright ownership.
5  *  The ASF licenses this file to You under the Apache License, Version 2.0
6  *  (the "License"); you may not use this file except in compliance with
7  *  the License.  You may obtain a copy of the License at
8  *
9  *      http://www.apache.org/licenses/LICENSE-2.0
10  *
11  *  Unless required by applicable law or agreed to in writing, software
12  *  distributed under the License is distributed on an "AS IS" BASIS,
13  *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14  *  See the License for the specific language governing permissions and
15  *  limitations under the License.
16  */

17 package org.apache.tomcat.util.net;
18
19 import java.util.Objects;
20
21 public abstract class SocketProcessorBase<S> implements Runnable {
22
23     protected SocketWrapperBase<S> socketWrapper;
24     protected SocketEvent event;
25
26     public SocketProcessorBase(SocketWrapperBase<S> socketWrapper, SocketEvent event) {
27         reset(socketWrapper, event);
28     }
29
30
31     public void reset(SocketWrapperBase<S> socketWrapper, SocketEvent event) {
32         Objects.requireNonNull(event);
33         this.socketWrapper = socketWrapper;
34         this.event = event;
35     }
36
37
38     @Override
39     public final void run() {
40         synchronized (socketWrapper) {
41             // It is possible that processing may be triggered for read and
42             // write at the same time. The sync above makes sure that processing
43             // does not occur in parallel. The test below ensures that if the
44             // first event to be processed results in the socket being closed,
45             // the subsequent events are not processed.
46             if (socketWrapper.isClosed()) {
47                 return;
48             }
49             doRun();
50         }
51     }
52
53
54     protected abstract void doRun();
55 }
56