001 /*
002 * Copyright 2008-2015 the original author or authors.
003 *
004 * Licensed under the Apache License, Version 2.0 (the "License");
005 * you may not use this file except in compliance with the License.
006 * You may obtain a copy of the License at
007 *
008 * http://www.apache.org/licenses/LICENSE-2.0
009 *
010 * Unless required by applicable law or agreed to in writing, software
011 * distributed under the License is distributed on an "AS IS" BASIS,
012 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
013 * See the License for the specific language governing permissions and
014 * limitations under the License.
015 */
016 package org.codehaus.griffon.runtime.core.artifact;
017
018
019 import griffon.core.GriffonApplication;
020 import griffon.core.artifact.GriffonModel;
021 import griffon.core.artifact.GriffonModelClass;
022
023 import javax.annotation.Nonnull;
024 import javax.annotation.Nullable;
025 import javax.inject.Inject;
026 import java.beans.PropertyChangeEvent;
027 import java.beans.PropertyChangeListener;
028 import java.beans.PropertyChangeSupport;
029 import java.beans.PropertyVetoException;
030 import java.beans.VetoableChangeListener;
031 import java.beans.VetoableChangeSupport;
032
033 import static griffon.util.GriffonNameUtils.requireNonBlank;
034 import static java.util.Objects.requireNonNull;
035
036 /**
037 * Base implementation of the GriffonModel interface.
038 *
039 * @author Andres Almiray
040 * @since 2.0.0
041 */
042 public abstract class AbstractGriffonModel extends AbstractGriffonMvcArtifact implements GriffonModel {
043 private static final String ERROR_EVENT_NULL = "Argument 'event' must not be null";
044 private static final String ERROR_PROPERTY_NAME_BLANK = "Argument 'propertyName' must not be blank";
045 protected final PropertyChangeSupport pcs;
046 protected final VetoableChangeSupport vcs;
047
048 public AbstractGriffonModel() {
049 pcs = new PropertyChangeSupport(this);
050 vcs = new VetoableChangeSupport(this);
051 }
052
053 /**
054 * Creates a new instance of this class.
055 *
056 * @param application the GriffonApplication that holds this artifact.
057 * @deprecated Griffon prefers field injection over constructor injector for artifacts as of 2.1.0
058 */
059 @Inject
060 @Deprecated
061 public AbstractGriffonModel(@Nonnull GriffonApplication application) {
062 super(application);
063 pcs = new PropertyChangeSupport(this);
064 vcs = new VetoableChangeSupport(this);
065 }
066
067 @Nonnull
068 @Override
069 protected String getArtifactType() {
070 return GriffonModelClass.TYPE;
071 }
072
073 @Override
074 public void addVetoableChangeListener(@Nullable VetoableChangeListener listener) {
075 vcs.addVetoableChangeListener(listener);
076 }
077
078 @Override
079 public void addVetoableChangeListener(@Nullable String propertyName, @Nullable VetoableChangeListener listener) {
080 vcs.addVetoableChangeListener(propertyName, listener);
081 }
082
083 @Override
084 public void removeVetoableChangeListener(@Nullable VetoableChangeListener listener) {
085 vcs.removeVetoableChangeListener(listener);
086 }
087
088 @Override
089 public void removeVetoableChangeListener(@Nullable String propertyName, @Nullable VetoableChangeListener listener) {
090 vcs.removeVetoableChangeListener(propertyName, listener);
091 }
092
093 @Nonnull
094 @Override
095 public VetoableChangeListener[] getVetoableChangeListeners() {
096 return vcs.getVetoableChangeListeners();
097 }
098
099 @Nonnull
100 @Override
101 public VetoableChangeListener[] getVetoableChangeListeners(@Nullable String propertyName) {
102 return vcs.getVetoableChangeListeners(propertyName);
103 }
104
105 @Override
106 public void addPropertyChangeListener(@Nullable PropertyChangeListener listener) {
107 pcs.addPropertyChangeListener(listener);
108 }
109
110 @Override
111 public void addPropertyChangeListener(@Nullable String propertyName, @Nullable PropertyChangeListener listener) {
112 pcs.addPropertyChangeListener(propertyName, listener);
113 }
114
115 @Override
116 public void removePropertyChangeListener(@Nullable PropertyChangeListener listener) {
117 pcs.removePropertyChangeListener(listener);
118 }
119
120 @Override
121 public void removePropertyChangeListener(@Nullable String propertyName, @Nullable PropertyChangeListener listener) {
122 pcs.removePropertyChangeListener(propertyName, listener);
123 }
124
125 @Nonnull
126 @Override
127 public PropertyChangeListener[] getPropertyChangeListeners() {
128 return pcs.getPropertyChangeListeners();
129 }
130
131 @Nonnull
132 @Override
133 public PropertyChangeListener[] getPropertyChangeListeners(@Nullable String propertyName) {
134 return pcs.getPropertyChangeListeners(propertyName);
135 }
136
137 protected void firePropertyChange(@Nonnull PropertyChangeEvent event) {
138 pcs.firePropertyChange(requireNonNull(event, ERROR_EVENT_NULL));
139 }
140
141 protected void firePropertyChange(@Nonnull String propertyName, @Nullable Object oldValue, @Nullable Object newValue) {
142 pcs.firePropertyChange(requireNonBlank(propertyName, ERROR_PROPERTY_NAME_BLANK), oldValue, newValue);
143 }
144
145 protected void fireVetoableChange(@Nonnull PropertyChangeEvent event) throws PropertyVetoException {
146 vcs.fireVetoableChange(requireNonNull(event, ERROR_EVENT_NULL));
147 }
148
149 protected void fireVetoableChange(@Nonnull String propertyName, @Nullable Object oldValue, @Nullable Object newValue) throws PropertyVetoException {
150 vcs.fireVetoableChange(requireNonBlank(propertyName, ERROR_PROPERTY_NAME_BLANK), oldValue, newValue);
151 }
152 }
|