blob: b1b8190a3b23dcf153f69d7652c7cc08cb953161 [file] [log] [blame]
//------------------------------------------------------------------------------
// Copyright (c) 2005, 2006 IBM Corporation and others.
// 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:
// IBM Corporation - initial implementation
//------------------------------------------------------------------------------
package org.eclipse.epf.importing.services;
import java.util.ArrayList;
import java.util.List;
import org.eclipse.epf.uma.MethodElement;
import org.eclipse.epf.uma.MethodLibrary;
/**
* Displays the element differences in a tree.
*
* @author Jinhua Xi
* @since 1.0
*/
public class ElementDiffTree {
public static final int DIFF_STATE_SAME = 0;
public static final int DIFF_STATE_NEW = 1;
public static final int DIFF_STATE_CHANGED = 4;
public static final int DIFF_STATE_OLD_ONLY = 5;
private MethodElement e1;
private MethodElement e2;
// The parent in the base library if e2 is a new element.
private MethodElement e1_parent;
private ElementDiffTree parent = null;
// Define the diff state of the second element compared to the first one.
private int diffState = DIFF_STATE_SAME;
private List children = new ArrayList();
private boolean hasDirtyChild = false;
/**
* Creates a new instance.
*/
public ElementDiffTree(MethodElement e1, MethodElement e2) {
this(e1, e2, null);
}
/**
* Creates a new instance.
*/
public ElementDiffTree(MethodElement e1, MethodElement e2,
MethodElement e1_parent) {
this.e1_parent = e1_parent;
this.e1 = e1;
this.e2 = e2;
resolveDiffState();
}
/**
* Returns the base method element.
*/
public MethodElement getBaseElement() {
return e1;
}
/**
* Returns the base method element's parent.
*/
public MethodElement getBaseParentElement() {
return e1_parent;
}
/**
* Returns the import method element.
*/
public MethodElement getImportElement() {
return e2;
}
/**
* Checks whether the element is new to the library.
*/
public boolean isNew() {
return (e1 == null) && (e2 != null);
}
/**
* Checks whether the element exists only in the library and not in the
* configuration to be imported.
*/
public boolean isOldOnly() {
return (e1 != null) && (e2 == null);
}
/**
* Returns true if both base and import elements are not null,
* otherwise returns false.
*/
public boolean isBoth() {
return (e1 != null) && (e2 != null);
}
/**
* Adds a child node.
*/
public void addChild(ElementDiffTree child) {
children.add(child);
child.setParent(this);
}
/**
* hasDirtyChild attribute.
*/
public boolean hasDirtyChild() {
return this.hasDirtyChild;
}
/**
* Sets hasDirtyChild attribute.
*/
public void setDirtyChild(boolean flag) {
hasDirtyChild = hasDirtyChild || flag;
if (hasDirtyChild && parent != null) {
parent.setDirtyChild(hasDirtyChild);
}
}
private void setParent(ElementDiffTree parent) {
this.parent = parent;
if (diffState != DIFF_STATE_SAME && parent != null) {
parent.setDirtyChild(true);
}
}
/**
* Returns the parent.
*/
public ElementDiffTree getParent() {
return this.parent;
}
/**
* hasChildren attribute.
*/
public boolean hasChildren() {
return (children != null) && (children.size() > 0);
}
/**
* Returns the child list.
*/
public List getChildren() {
return children;
}
/**
* Returns the diff state of the second element comparing to the first one.
*/
public int getDiffState() {
return diffState;
}
/**
* Returns a message string.
*/
public String getDiffMessage() {
return "[" + getVersion(e1) + "] : [" + getVersion(e2) + "]"; //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
}
private void resolveDiffState() {
// how to fidd two elements?
// 1. attributes
// 2. version number
// 3. children
// 4. references
// 5. ...
if (e1 == null) {
diffState = DIFF_STATE_NEW;
} else if (e2 == null) {
diffState = DIFF_STATE_OLD_ONLY;
} else {
if (e1 instanceof MethodLibrary) {
diffState = DIFF_STATE_SAME;
} else {
diffState = DIFF_STATE_CHANGED;
}
}
}
private String getVersion(MethodElement element) {
if (element == null) {
return ""; //$NON-NLS-1$
}
return getPackage(element).getVersion();
}
private org.eclipse.epf.uma.MethodUnit getPackage(MethodElement element) {
if (element instanceof org.eclipse.epf.uma.MethodUnit) {
return (org.eclipse.epf.uma.MethodUnit) element;
}
return getPackage((MethodElement) element.eContainer());
}
// Utility method to get the element information.
/**
* Returns the name.
*/
public String getName() {
if (e1 != null) {
return e1.getName();
}
if (e2 != null) {
return e2.getName();
} else {
return ""; //$NON-NLS-1$
}
}
/**
* Returns the content type.
*/
public String getContentType() {
MethodElement e = e1;
if (e == null) {
e = e2;
}
if (e != null) {
return e.getType().getName();
}
return ""; //$NON-NLS-1$
}
public void debugDump() {
debugDump(0, ""); //$NON-NLS-1$
}
private void debugDump(int level, String indent) {
String line = null;
if (e1 == null) {
line = "null"; //$NON-NLS-1$
} else {
line = e1.getGuid() + ", " + e1.getName() + ", " + e1.eClass().getName(); //$NON-NLS-1$ //$NON-NLS-2$
}
outLn(level, indent, line);
if (e2 == null) {
line = "null"; //$NON-NLS-1$
} else {
line = e2.getGuid() + ", " + e2.getName() + ", " + e2.eClass().getName(); //$NON-NLS-1$ //$NON-NLS-2$
}
outLn(level, indent, line);
System.out.println(""); //$NON-NLS-1$
for (int i=0; i < children.size(); i++) {
ElementDiffTree child = (ElementDiffTree) children.get(i);
child.debugDump(level + 1, indent + " "); //$NON-NLS-1$
}
}
private void outLn(int level, String indent, String line) {
String str = indent + level + ": " + line; //$NON-NLS-1$
System.out.println(str);
}
}