/******************************************************************************
* Copyright (c) 2005 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 API and implementation
****************************************************************************/
package org.eclipse.gmf.runtime.doclet.utils;
import java.util.HashMap;
import java.util.HashSet;
import java.util.Iterator;
import java.util.Map;
import java.util.Set;
import org.eclipse.gmf.runtime.doclet.ITagDefinitions;
import com.sun.javadoc.ClassDoc;
import com.sun.javadoc.PackageDoc;
import com.sun.javadoc.ProgramElementDoc;
import com.sun.javadoc.RootDoc;
import com.sun.javadoc.Tag;
/**
* Generator for all canBeSeenBy maps. Traverse all packages, classes, and members to find
* @canbeSeenBy tags and records them in a map.
*/
public class MapsGenerator {
private static final String NAMESPACE_SEPARATOR = ","; //$NON-NLS-1$
private HashMap canBeSeenByMap = null;
private RootDoc root;
private AliasRegistry aliasRegistry;
public MapsGenerator(RootDoc root, AliasRegistry aliasRegistry) {
this.root = root;
this.aliasRegistry = aliasRegistry;
generateMaps();
printMaps();
}
public HashMap getCanBeSeeByMap() {
return this.canBeSeenByMap;
}
public AliasRegistry getAliasRegistry() {
return this.aliasRegistry;
}
private void generateMaps() {
this.canBeSeenByMap = new HashMap();
if (root.classes() != null) {
visitClassDocs(root.classes());
}
if (root.specifiedPackages() != null) {
visitPackageDocs(root.specifiedPackages());
}
}
private void visitClassDocs(ClassDoc classDocs[]) {
for (int i = 0; i < classDocs.length; i++) {
ClassDoc classDoc = classDocs[i];
visitClassDoc(classDoc);
}
}
private void visitClassDoc(ClassDoc classDoc) {
addVisibilityRules(classDoc);
addVisibilityRules(classDoc.constructors());
addVisibilityRules(classDoc.methods());
addVisibilityRules(classDoc.fields());
visitClassDocs(classDoc.innerClasses());
visitPackageDoc(classDoc.containingPackage());
}
private void visitPackageDocs(PackageDoc packageDocs[]) {
for (int i = 0; i < packageDocs.length; i++) {
PackageDoc packageDoc = packageDocs[i];
visitPackageDoc(packageDoc);
}
}
private void visitPackageDoc(PackageDoc packageDoc) {
addVisibilityRules(packageDoc.tags(ITagDefinitions.TAG_CAN_BE_SEEN_BY),
packageDoc.name());
}
private void addVisibilityRules(ProgramElementDoc programElementDocs[]) {
for (int i = 0; i < programElementDocs.length; i++) {
ProgramElementDoc programElementDoc = programElementDocs[i];
addVisibilityRules(programElementDoc);
}
}
private void addVisibilityRules(ProgramElementDoc programElementDoc) {
addVisibilityRules(programElementDoc
.tags(ITagDefinitions.TAG_CAN_BE_SEEN_BY), programElementDoc
.qualifiedName());
}
private void addVisibilityRules(Tag canBeSeenByTags[], String qualifiedName) {
for (int i = 0; i < canBeSeenByTags.length; i++) {
Tag tag = canBeSeenByTags[i];
addVisibilityRule(getCanBeSeeByMap(), qualifiedName, tag.text());
}
}
private void addVisibilityRule(HashMap map, String qualifiedName,
String allowedNamespace) {
String aliasValue = getAliasRegistry().getAliasValue(allowedNamespace);
if (aliasValue != null) {
allowedNamespace = aliasValue;
}
String allowedNamespaces[] = allowedNamespace
.split(NAMESPACE_SEPARATOR);
for (int i = 0; i < allowedNamespaces.length; i++) {
String singleNamespace = allowedNamespaces[i];
Set existingAllowedNamespaces = (Set) map.get(qualifiedName);
if (existingAllowedNamespaces == null) {
existingAllowedNamespaces = new HashSet();
map.put(qualifiedName, existingAllowedNamespaces);
}
existingAllowedNamespaces.add(singleNamespace);
}
}
private void printMaps() {
System.out.println();
System.out
.println("************************* START @canBeSeenBy Map ***************************"); //$NON-NLS-1$
System.out.println();
Set entries = getCanBeSeeByMap().entrySet();
for (Iterator iterEntry = entries.iterator(); iterEntry.hasNext();) {
Map.Entry entry = (Map.Entry) iterEntry.next();
Set namespaces = (Set) entry.getValue();
for (Iterator iterNamespace = namespaces.iterator(); iterNamespace
.hasNext();) {
String namespace = (String) iterNamespace.next();
System.out.println((String) entry.getKey() + "\t->\t" + namespace); //$NON-NLS-1$
}
}
System.out.println();
System.out
.println("************************* END @canBeSeenBy Map ***************************"); //$NON-NLS-1$
System.out.println();
}
}