blob: 63eac3a6ec6e28aa2a9e4fc2a5e15a144ca4abbe [file] [log] [blame]
/*
* 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.apache.uima.caseditor.core.model.delta;
import java.util.Collection;
import java.util.LinkedList;
import org.apache.uima.caseditor.core.model.INlpElement;
import org.eclipse.core.resources.IResource;
import org.eclipse.core.resources.IResourceDelta;
import org.eclipse.core.runtime.IPath;
/**
* The internal implementation of the nlp model delta interface.
*
* TODO: Add a filter to avoid node with Kind.NOTHING.
*/
public final class NlpModelDeltaImpl implements INlpElementDelta {
private IResourceDelta mResourceDelta;
private Collection<INlpElementDelta> mChildren = new LinkedList<INlpElementDelta>();
private INlpElement mNlpElement;
/**
* The kind of the event. After an project was opened the old closed project (closed project does
* not have a natures) must be removed. Then the newly created NlpProject will be added. For this
* add the kind must be changed from changed to added. To have control about the kind the status
* is duplicated here.
*/
private Kind mKind;
private NlpModelDeltaImpl mParent;
/**
* Initializes a new instance.
*
* @param parent
* @param resourceDelta
*/
public NlpModelDeltaImpl(NlpModelDeltaImpl parent, IResourceDelta resourceDelta) {
mParent = parent;
mResourceDelta = resourceDelta;
mKind = getKind(resourceDelta);
IResourceDelta deltas[] = mResourceDelta.getAffectedChildren();
for (IResourceDelta element : deltas) {
if (element.getFlags() != IResourceDelta.MARKERS) {
mChildren.add(new NlpModelDeltaImpl(this, element));
}
}
}
/**
* Sets the nlp element Note: do not call this method from outside code
*
* @param element
*/
public void setNlpElement(INlpElement element) {
mNlpElement = element;
}
/**
* Retrieves the parent element or null if this is the root delta.
*
* @return parent element or null
*/
public INlpElementDelta getParent() {
return mParent;
}
/**
* Adds a child to the current element instance.
*
* @param child
*/
public void addChild(NlpModelDeltaImpl child) {
mChildren.add(child);
}
/**
* Accepts the given visitor.
*/
public void accept(INlpModelDeltaVisitor visitor) {
boolean wantsToVisitChilds = visitor.visit(this);
if (wantsToVisitChilds) {
for (INlpElementDelta delta : getAffectedChildren()) {
delta.accept(visitor);
}
}
}
/**
* Retrieves the affected children.
*/
public INlpElementDelta[] getAffectedChildren() {
return mChildren.toArray(new INlpElementDelta[mChildren.size()]);
}
/**
* Checks if the current instance is a nlp element.
*/
public boolean isNlpElement() {
return mNlpElement != null;
}
/**
* Retrieves the nlp element.
*/
public INlpElement getNlpElement() {
return mNlpElement;
}
/**
* Retrieves the resource.
*/
public IResource getResource() {
return mResourceDelta.getResource();
}
/**
* Retrieves the kind
*/
public Kind getKind() {
return mKind;
}
/**
* Sets the new kind. This method should only be called from the event handlers and not by any
* client.
*
* @param kind
*/
public void setKind(Kind kind) {
mKind = kind;
}
/**
* Retrieves the original flags of the {@link IResourceDelta} object.
*/
public int getFlags() {
return mResourceDelta.getFlags();
}
/**
* Retrieves the resource delta.
*
* @return the resource delta
*/
public IResourceDelta getResourceDelta() {
return mResourceDelta;
}
public IPath getMovedFromPath() {
return mResourceDelta.getMovedFromPath();
}
public IPath getMovedToPath() {
return mResourceDelta.getMovedToPath();
}
/**
* Retrieves a human-readable string of the current instance.
*/
@Override
public String toString() {
return (isNlpElement() ? "Nlp: " : "") + mResourceDelta.toString();
}
private static Kind getKind(IResourceDelta delta) {
Kind kind;
if ((delta.getKind() & (IResourceDelta.ADDED | IResourceDelta.ADDED_PHANTOM)) != 0) {
kind = Kind.ADDED;
} else if ((delta.getKind() & (IResourceDelta.REMOVED | IResourceDelta.REMOVED_PHANTOM)) != 0) {
kind = Kind.REMOVED;
} else if ((delta.getKind() & IResourceDelta.CHANGED) != 0) {
kind = Kind.CHANGED;
} else {
kind = null;
}
return kind;
}
}