001: /*******************************************************************************
002: * Copyright (c) 2000, 2006 IBM Corporation and others.
003: * All rights reserved. This program and the accompanying materials
004: * are made available under the terms of the Eclipse Public License v1.0
005: * which accompanies this distribution, and is available at
006: * http://www.eclipse.org/legal/epl-v10.html
007: *
008: * Contributors:
009: * IBM Corporation - initial API and implementation
010: *******************************************************************************/package org.eclipse.jdt.internal.ui.browsing;
011:
012: import java.util.HashSet;
013: import java.util.Iterator;
014: import java.util.Set;
015:
016: import org.eclipse.core.runtime.Assert;
017: import org.eclipse.core.runtime.PlatformObject;
018:
019: import org.eclipse.jdt.core.IJavaProject;
020: import org.eclipse.jdt.core.IPackageFragment;
021: import org.eclipse.jdt.core.JavaModelException;
022:
023: /**
024: * Contains a list of package fragments with the same name
025: * but residing in different source folders of a unique Java project.
026: */
027: public class LogicalPackage extends PlatformObject {
028:
029: private Set fPackages;
030: private String fName;
031: private IJavaProject fJavaProject;
032:
033: public LogicalPackage(IPackageFragment fragment) {
034: Assert.isNotNull(fragment);
035: fPackages = new HashSet();
036: fJavaProject = fragment.getJavaProject();
037: Assert.isNotNull(fJavaProject);
038: add(fragment);
039: fName = fragment.getElementName();
040: }
041:
042: public IJavaProject getJavaProject() {
043: return fJavaProject;
044: }
045:
046: public IPackageFragment[] getFragments() {
047: return (IPackageFragment[]) fPackages
048: .toArray(new IPackageFragment[fPackages.size()]);
049: }
050:
051: public void add(IPackageFragment fragment) {
052: Assert.isTrue(fragment != null
053: && fJavaProject.equals(fragment.getJavaProject()));
054: fPackages.add(fragment);
055: }
056:
057: public void remove(IPackageFragment fragment) {
058: fPackages.remove(fragment);
059: }
060:
061: public boolean contains(IPackageFragment fragment) {
062: return fPackages.contains(fragment);
063: }
064:
065: public String getElementName() {
066: return fName;
067: }
068:
069: public int size() {
070: return fPackages.size();
071: }
072:
073: /**
074: * Returns true if the given fragment has the same name and
075: * resides inside the same project as the other fragments in
076: * the LogicalPackage.
077: *
078: * @param fragment
079: * @return boolean
080: */
081: public boolean belongs(IPackageFragment fragment) {
082:
083: if (fragment == null)
084: return false;
085:
086: if (fJavaProject.equals(fragment.getJavaProject())) {
087: return fName.equals(fragment.getElementName());
088: }
089:
090: return false;
091: }
092:
093: public boolean hasSubpackages() throws JavaModelException {
094: for (Iterator iter = fPackages.iterator(); iter.hasNext();) {
095: IPackageFragment pack = (IPackageFragment) iter.next();
096: if (pack.hasSubpackages()) {
097: return true;
098: }
099: }
100: return false;
101: }
102:
103: public boolean isDefaultPackage() {
104: return fName.length() == 0;
105: }
106:
107: public boolean equals(Object o) {
108: if (!(o instanceof LogicalPackage))
109: return false;
110:
111: LogicalPackage lp = (LogicalPackage) o;
112: if (!fJavaProject.equals(lp.getJavaProject()))
113: return false;
114:
115: IPackageFragment[] fragments = lp.getFragments();
116:
117: if (fragments.length != getFragments().length)
118: return false;
119:
120: //this works because a LogicalPackage cannot contain the same IPackageFragment twice
121: for (int i = 0; i < fragments.length; i++) {
122: IPackageFragment fragment = fragments[i];
123: if (!fPackages.contains(fragment))
124: return false;
125: }
126:
127: return true;
128: }
129:
130: /* (non-Javadoc)
131: * @see java.lang.Object#hashCode()
132: */
133: public int hashCode() {
134: IPackageFragment[] fragments = getFragments();
135: return fJavaProject.hashCode()
136: + getHash(fragments, fragments.length - 1);
137: }
138:
139: private int getHash(IPackageFragment[] fragments, int index) {
140: if (index <= 0)
141: return fragments[0].hashCode() * 17;
142: else
143: return fragments[index].hashCode() * 17
144: + getHash(fragments, index - 1);
145: }
146: }
|