001 /* 002 * Licensed to the Apache Software Foundation (ASF) under one or more 003 * contributor license agreements. See the NOTICE file distributed with 004 * this work for additional information regarding copyright ownership. 005 * The ASF licenses this file to You under the Apache license, Version 2.0 006 * (the "License"); you may not use this file except in compliance with 007 * the License. You may obtain a copy of the License at 008 * 009 * http://www.apache.org/licenses/LICENSE-2.0 010 * 011 * Unless required by applicable law or agreed to in writing, software 012 * distributed under the License is distributed on an "AS IS" BASIS, 013 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 014 * See the license for the specific language governing permissions and 015 * limitations under the license. 016 */ 017 package org.apache.logging.log4j.core; 018 019 import java.io.Serializable; 020 021 import org.apache.logging.log4j.status.StatusLogger; 022 023 /** 024 * A life cycle to be extended. 025 * <p> 026 * Wraps a {@link LifeCycle.State}. 027 * </p> 028 */ 029 public class AbstractLifeCycle implements LifeCycle, Serializable { 030 031 /** 032 * Allow subclasses access to the status logger without creating another instance. 033 */ 034 protected static final org.apache.logging.log4j.Logger LOGGER = StatusLogger.getLogger(); 035 036 private static final long serialVersionUID = 1L; 037 038 private volatile LifeCycle.State state = LifeCycle.State.INITIALIZED; 039 040 protected boolean equalsImpl(final Object obj) { 041 if (this == obj) { 042 return true; 043 } 044 if (obj == null) { 045 return false; 046 } 047 if (getClass() != obj.getClass()) { 048 return false; 049 } 050 final LifeCycle other = (LifeCycle) obj; 051 if (state != other.getState()) { 052 return false; 053 } 054 return true; 055 } 056 057 @Override 058 public LifeCycle.State getState() { 059 return this.state; 060 } 061 062 protected int hashCodeImpl() { 063 final int prime = 31; 064 int result = 1; 065 result = prime * result + ((state == null) ? 0 : state.hashCode()); 066 return result; 067 } 068 069 public boolean isInitialized() { 070 return this.state == LifeCycle.State.INITIALIZED; 071 } 072 073 @Override 074 public boolean isStarted() { 075 return this.state == LifeCycle.State.STARTED; 076 } 077 078 public boolean isStarting() { 079 return this.state == LifeCycle.State.STARTING; 080 } 081 082 @Override 083 public boolean isStopped() { 084 return this.state == LifeCycle.State.STOPPED; 085 } 086 087 public boolean isStopping() { 088 return this.state == LifeCycle.State.STOPPING; 089 } 090 091 protected void setStarted() { 092 this.setState(LifeCycle.State.STARTED); 093 } 094 095 protected void setStarting() { 096 this.setState(LifeCycle.State.STARTING); 097 } 098 099 protected void setState(final LifeCycle.State newState) { 100 this.state = newState; 101 // Need a better string than this.toString() for the message 102 // LOGGER.debug("{} {}", this.state, this); 103 } 104 105 protected void setStopped() { 106 this.setState(LifeCycle.State.STOPPED); 107 } 108 109 protected void setStopping() { 110 this.setState(LifeCycle.State.STOPPING); 111 } 112 113 @Override 114 public void start() { 115 this.setStarted(); 116 } 117 118 @Override 119 public void stop() { 120 this.state = LifeCycle.State.STOPPED; 121 } 122 123 }