blob: a8170e87a0cbdc9e5692a6885caf924056a760ae [file] [log] [blame]
/**
* Copyright (c) 2011, 2015 - Lunifera GmbH (Gross Enzersdorf, Austria), Loetz GmbH&Co.KG (69115 Heidelberg, Germany)
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License v1.0
* which accompanies this distribution, and is available at
* http://www.eclipse.org/legal/epl-v10.html
*
* Contributors:
* Florian Pirchner - Initial implementation
*/
package org.eclipse.osbp.runtime.common.annotations;
import java.beans.PropertyChangeEvent;
import java.beans.PropertyChangeListener;
import java.io.Serializable;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
/**
* A property change listener which may be added to several dto instances. It
* sets the dirty flag on a dto and keeps an additional dirty flag for the whole
* structure, where the adapter was added.
*/
public class DirtyStateAdapter implements PropertyChangeListener, Serializable {
private static final long serialVersionUID = 3286204198033608643L;
/** The Constant LOGGER. */
private static final Logger LOGGER = LoggerFactory
.getLogger(DirtyStateAdapter.class);
/** The dirty. */
private boolean dirty;
/** The active. */
private boolean active;
/* (non-Javadoc)
* @see java.beans.PropertyChangeListener#propertyChange(java.beans.PropertyChangeEvent)
*/
@Override
public void propertyChange(PropertyChangeEvent event) {
if (!active) {
return;
}
Object object = event.getSource();
Class<?> objClass = object.getClass();
try {
if (DtoUtils.isDisposeField(objClass, event.getPropertyName())) {
return;
}
// dirty field not forwarded to handle dirty
if (DtoUtils.isDirtyField(objClass, event.getPropertyName())) {
return;
}
} catch (SecurityException ignoreIt) {
LOGGER.error("{}", ignoreIt);
}
handleDirty(event);
}
/**
* True, if the adapter handles notifications.
*
* @return true, if is active
*/
public boolean isActive() {
return active;
}
/**
* True, if the adapter handles notifications.
*
* @param active the new active
*/
public void setActive(boolean active) {
this.active = active;
}
/**
* Sets the dirty flag.
*
* @param event the event
*/
protected void handleDirty(PropertyChangeEvent event) {
Object object = event.getSource();
// set the dirty flag to true if available
DtoUtils.invokeDirtySetter(object, true);
dirty = true;
}
/**
* Returns true, if the dto structure became dirty.
*
* @return true, if is dirty
*/
public boolean isDirty() {
return dirty;
}
}