|
Author: adrianc
Date: Mon Apr 22 05:37:31 2013 New Revision: 1470389 URL: http://svn.apache.org/r1470389 Log: Added an Observable class and Observer interface. These will be used in an improved GenericEntity implementation. Added: ofbiz/trunk/framework/base/src/org/ofbiz/base/util/Observable.java (with props) ofbiz/trunk/framework/base/src/org/ofbiz/base/util/Observer.java (with props) Added: ofbiz/trunk/framework/base/src/org/ofbiz/base/util/Observable.java URL: http://svn.apache.org/viewvc/ofbiz/trunk/framework/base/src/org/ofbiz/base/util/Observable.java?rev=1470389&view=auto ============================================================================== --- ofbiz/trunk/framework/base/src/org/ofbiz/base/util/Observable.java (added) +++ ofbiz/trunk/framework/base/src/org/ofbiz/base/util/Observable.java Mon Apr 22 05:37:31 2013 @@ -0,0 +1,121 @@ +/******************************************************************************* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you 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. + *******************************************************************************/ +package org.ofbiz.base.util; + +import java.util.concurrent.CopyOnWriteArrayList; +import java.util.concurrent.atomic.AtomicBoolean; + +/** + * An observable object. + * <p>This class is similar to <code>java.util.Observable</code> but it has some differences: + * <ul> + * <li>It has improved concurrency</li> + * <li>It cannot be subclassed</li> + * <li>The <code>notifyObservers</code> method does not clear the changed flag</li> + * <li>Protected methods have been made public</li> + * </ul></p> + * + */ +public final class Observable { + + private final AtomicBoolean changed = new AtomicBoolean();; + private final CopyOnWriteArrayList<Observer> observers = new CopyOnWriteArrayList<Observer>(); + + public Observable() {} + + public Observable(Observable observable) { + Assert.notNull("observable", observable); + changed.set(observable.changed.get()); + observers.addAll(observable.observers); + } + + /** + * Adds an observer to the set of observers for this object. + * + * @param observer the observer to be added. + */ + public void addObserver(Observer observer) { + Assert.notNull("observer", observer); + observers.addIfAbsent(observer); + } + + /** + * Clears the changed flag. + */ + public void clearChanged() { + changed.set(false); + } + + /** + * Deletes an observer from the set of observers of this object. + * Passing <code>null</code> to this method will have no effect. + * + * @param observer the observer to be deleted. + */ + public void deleteObserver(Observer observer) { + observers.remove(observer); + } + + /** + * Clears the observer list so that this object no longer has any observers. + */ + public void deleteObservers() { + observers.clear(); + } + + /** + * Returns <code>true</code> if this object has changed. + * + */ + public boolean hasChanged() { + return changed.get(); + } + + /** + * Notify all of the observers. + * <p>Each <code>Observer</code> has its <code>update</code> method called with two + * arguments: this observable object and <code>null</code>. In other + * words, this method is equivalent to: + * <blockquote><tt> + * notifyObservers(null)</tt></blockquote></p> + * + */ + public void notifyObservers() { + notifyObservers(null); + } + + /** + * Notify all of the observers. + * <p>Each observer has its <code>update</code> method called with two + * arguments: this observable object and the <code>arg</code> argument.</p> + * + */ + public void notifyObservers(Object arg) { + for (Observer observer : observers) { + observer.update(this, arg); + } + } + + /** + * Sets the changed flag to <code>true</code>. + */ + public void setChanged() { + changed.set(true); + } +} Propchange: ofbiz/trunk/framework/base/src/org/ofbiz/base/util/Observable.java ------------------------------------------------------------------------------ svn:eol-style = native Propchange: ofbiz/trunk/framework/base/src/org/ofbiz/base/util/Observable.java ------------------------------------------------------------------------------ svn:keywords = Author Date Id Rev URL Added: ofbiz/trunk/framework/base/src/org/ofbiz/base/util/Observer.java URL: http://svn.apache.org/viewvc/ofbiz/trunk/framework/base/src/org/ofbiz/base/util/Observer.java?rev=1470389&view=auto ============================================================================== --- ofbiz/trunk/framework/base/src/org/ofbiz/base/util/Observer.java (added) +++ ofbiz/trunk/framework/base/src/org/ofbiz/base/util/Observer.java Mon Apr 22 05:37:31 2013 @@ -0,0 +1,33 @@ +/******************************************************************************* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you 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. + *******************************************************************************/ +package org.ofbiz.base.util; + +/** + * An <code>Observable</code> observer. + * + */ +public interface Observer { + /** + * Called when <code>Observable.notifyObservers</code> is invoked. + * + * @param observable + * @param arg + */ + void update(Observable observable, Object arg); +} Propchange: ofbiz/trunk/framework/base/src/org/ofbiz/base/util/Observer.java ------------------------------------------------------------------------------ svn:eol-style = native Propchange: ofbiz/trunk/framework/base/src/org/ofbiz/base/util/Observer.java ------------------------------------------------------------------------------ svn:keywords = Author Date Id Rev URL |
| Free forum by Nabble | Edit this page |
