/******************************************************************************
* 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.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.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();
}
}