/*
* Copyright (C) 2011 eXo Platform SAS.
*
* This is free software; you can redistribute it and/or modify it
* under the terms of the GNU Lesser General Public License as
* published by the Free Software Foundation; either version 2.1 of
* the License, or (at your option) any later version.
*
* This software is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public
* License along with this software; if not, write to the Free
* Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
* 02110-1301 USA, or see the FSF site: http://www.fsf.org.
*/
package org.exoplatform.portal.mop.navigation;
/**
* Describe a change applied to a node.
*
* @author <a href="mailto:julien.viet@exoplatform.com">Julien Viet</a>
*/
public abstract class NodeChange<N> {
/** The target. */
final N target;
private NodeChange(N target) {
if (target == null) {
throw new NullPointerException("No null target accepted");
}
//
this.target = target;
}
public final N getTarget() {
return target;
}
/**
* Dispatch the change to the proper listener method:
* <ul>
* <li>{@link Created} dispatches to {@link NodeChangeListener#onCreate(Object, Object, Object, String)}</li>
* <li>{@link Added} dispatches to {@link NodeChangeListener#onAdd(Object, Object, Object)}</li>
* <li>{@link Destroyed} dispatches to {@link NodeChangeListener#onDestroy(Object, Object)}</li>
* <li>{@link Moved} dispatches to {@link NodeChangeListener#onMove(Object, Object, Object, Object)}</li>
* <li>{@link Removed} dispatches to {@link NodeChangeListener#onRemove(Object, Object)}</li>
* <li>{@link Renamed} dispatches to {@link NodeChangeListener#onRename(Object, Object, String)}</li>
* <li>{@link Updated} dispatches to {@link NodeChangeListener#onUpdate(Object, NodeState)}</li>
* </ul>
*
* @param listener the listener
*/
protected abstract void dispatch(NodeChangeListener<N> listener);
public static final class Destroyed<N> extends NodeChange<N> {
/** . */
final N parent;
Destroyed(N parent, N node) {
super(node);
//
if (parent == null) {
throw new NullPointerException("No null parent accepted");
}
//
this.parent = parent;
}
public N getParent() {
return parent;
}
@Override
protected void dispatch(NodeChangeListener<N> listener) {
listener.onDestroy(target, parent);
}
@Override
public String toString() {
return "NodeChange.Destroyed[target" + target + ",parent=" + parent + "]";
}
}
public static final class Removed<N> extends NodeChange<N> {
/** . */
final N parent;
Removed(N parent, N node) {
super(node);
//
if (parent == null) {
throw new NullPointerException("No null parent accepted");
}
//
this.parent = parent;
}
public N getParent() {
return parent;
}
@Override
protected void dispatch(NodeChangeListener<N> listener) {
listener.onRemove(target, parent);
}
@Override
public String toString() {
return "NodeChange.Removed[target" + target + ",parent=" + parent + "]";
}
}
public static final class Created<N> extends NodeChange<N> {
/** . */
final N parent;
/** . */
final N previous;
/** . */
final String name;
Created(N parent, N previous, N node, String name) throws NullPointerException {
super(node);
//
if (parent == null) {
throw new NullPointerException("No null parent accepted");
}
if (name == null) {
throw new NullPointerException("No null name accepted");
}
//
this.parent = parent;
this.previous = previous;
this.name = name;
}
public N getParent() {
return parent;
}
public N getPrevious() {
return previous;
}
public String getName() {
return name;
}
@Override
protected void dispatch(NodeChangeListener<N> listener) {
listener.onCreate(target, parent, previous, name);
}
@Override
public String toString() {
return "NodeChange.Created[target" + target + ",previous" + previous + ",parent=" + parent + ",name=" + name + "]";
}
}
public static final class Added<N> extends NodeChange<N> {
/** . */
final N parent;
/** . */
final N previous;
Added(N parent, N previous, N node) {
super(node);
//
if (parent == null) {
throw new NullPointerException("No null parent accepted");
}
//
this.parent = parent;
this.previous = previous;
}
public N getParent() {
return parent;
}
public N getPrevious() {
return previous != null ? previous : null;
}
@Override
protected void dispatch(NodeChangeListener<N> listener) {
listener.onAdd(target, parent, previous);
}
@Override
public String toString() {
return "NodeChange.Added[target" + target + ",previous" + previous + ",parent=" + parent + "]";
}
}
public static final class Moved<N> extends NodeChange<N> {
/** . */
final N from;
/** . */
final N to;
/** . */
final N previous;
Moved(N from, N to, N previous, N node) {
super(node);
//
if (from == null) {
throw new NullPointerException("No null from accepted");
}
//
if (to == null) {
throw new NullPointerException("No null to accepted");
}
//
this.from = from;
this.to = to;
this.previous = previous;
}
public N getFrom() {
return from;
}
public N getTo() {
return to;
}
public N getPrevious() {
return previous != null ? previous : null;
}
@Override
protected void dispatch(NodeChangeListener<N> listener) {
listener.onMove(target, from, to, previous);
}
@Override
public String toString() {
return "NodeChange.Moved[target" + target + ",from=" + from + ",to=" + to + ",previous=" + previous + "]";
}
}
public static final class Renamed<N> extends NodeChange<N> {
/** . */
final N parent;
/** . */
final String name;
Renamed(N parent, N node, String name) {
super(node);
//
if (parent == null) {
throw new NullPointerException("No null parent accepted");
}
if (name == null) {
throw new NullPointerException("No null name accepted");
}
//
this.parent = parent;
this.name = name;
}
public N getParent() {
return parent;
}
public String getName() {
return name;
}
@Override
protected void dispatch(NodeChangeListener<N> listener) {
listener.onRename(target, parent, name);
}
@Override
public String toString() {
return "NodeChange.Renamed[target" + target + ",name=" + name + "]";
}
}
public static final class Updated<N> extends NodeChange<N> {
/** . */
final NodeState state;
public Updated(N node, NodeState state) {
super(node);
//
this.state = state;
}
public NodeState getState() {
return state;
}
@Override
protected void dispatch(NodeChangeListener<N> listener) {
listener.onUpdate(target, state);
}
@Override
public String toString() {
return "NodeChange.Updated[target" + target + ",state=" + state + "]";
}
}
}