/******************************************************************************
* 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.proxies;
import java.util.ArrayList;
import com.sun.javadoc.ClassDoc;
import com.sun.javadoc.ConstructorDoc;
import com.sun.javadoc.Doc;
import com.sun.javadoc.ExecutableMemberDoc;
import com.sun.javadoc.FieldDoc;
import com.sun.javadoc.MemberDoc;
import com.sun.javadoc.MethodDoc;
import com.sun.javadoc.PackageDoc;
import com.sun.javadoc.ParamTag;
import com.sun.javadoc.Parameter;
import com.sun.javadoc.ProgramElementDoc;
import com.sun.javadoc.RootDoc;
import com.sun.javadoc.SeeTag;
import com.sun.javadoc.SerialFieldTag;
import com.sun.javadoc.Tag;
import com.sun.javadoc.ThrowsTag;
import com.sun.javadoc.Type;
/**
* Factory for proxy objects. Generate proxies for Object, typed Object, or collection.
* The factory is smart enough to always return the most derived proxy for a given element.
* The factory will always return the same proxy for a given object to wrap.
*/
public class ProxyFactory
{
private ProxyRegistry proxyRegistry = null;
private static ProxyFactory instance = null;
public static ProxyFactory getInstance()
{
if (instance == null)
{
instance = new ProxyFactory();
}
return instance;
}
/*
* DocProxy Proxies
*/
public DocProxy[] createDocProxies(Doc docs[])
{
ArrayList docProxies = new ArrayList();
for (int i = 0; i < docs.length; i++)
{
Doc doc = docs[i];
docProxies.add(createDocProxy(doc));
}
return (DocProxy[])docProxies.toArray(new DocProxy [0]);
}
public DocProxy createDocProxy(Object object)
{
DocProxy docProxy = null;
if (object instanceof DocProxy)
{
docProxy = (DocProxy)object;
}
else
{
if (object instanceof Doc)
{
docProxy = createDocProxy((Doc)object);
}
}
return docProxy;
}
public DocProxy createDocProxy(Doc doc)
{
DocProxy proxy = null;
if (doc != null)
{
proxy = (DocProxy)getProxyRegistry().getProxyForObject(doc);
if (proxy == null)
{
if (doc instanceof PackageDoc)
{
proxy = createPackageDocProxy((PackageDoc)doc);
}
else if (doc instanceof ProgramElementDoc)
{
proxy = createProgramElementDocProxy((ProgramElementDoc)doc);
}
else if (doc instanceof RootDoc)
{
proxy = createRootDocProxy((RootDoc)doc);
}
else
{
proxy = new DocProxy(doc);
ProxyFactory.getInstance().getProxyRegistry().registerProxy(doc, proxy);
}
}
}
return proxy;
}
/*
* PackageDoc Proxies
*/
public PackageDocProxy[] createPackageDocProxies(PackageDoc packageDocs[])
{
ArrayList packageDocProxies = new ArrayList();
for (int i = 0; i < packageDocs.length; i++)
{
PackageDoc packageDoc = packageDocs[i];
packageDocProxies.add(createPackageDocProxy(packageDoc));
}
return (PackageDocProxy[])packageDocProxies.toArray(new PackageDocProxy [0]);
}
public PackageDocProxy createPackageDocProxy(Object object)
{
PackageDocProxy packageDocProxy = null;
if (object instanceof PackageDocProxy)
{
packageDocProxy = (PackageDocProxy)object;
}
else
{
if (object instanceof PackageDoc)
{
packageDocProxy = createPackageDocProxy((PackageDoc)object);
}
}
return packageDocProxy;
}
public PackageDocProxy createPackageDocProxy(PackageDoc packageDoc)
{
PackageDocProxy proxy = null;
if (packageDoc != null)
{
proxy = (PackageDocProxy)getProxyRegistry().getProxyForObject(packageDoc);
if (proxy == null)
{
proxy = new PackageDocProxy(packageDoc);
ProxyFactory.getInstance().getProxyRegistry().registerProxy(packageDoc, proxy);
}
}
return proxy;
}
/*
* ProgramElementDocProxy Proxies
*/
public ProgramElementDocProxy[] createProgramElementDocProxies(ProgramElementDoc programElementDocs[])
{
ArrayList programElementDocProxies = new ArrayList();
for (int i = 0; i < programElementDocs.length; i++)
{
ProgramElementDoc programElementDoc = programElementDocs[i];
programElementDocProxies.add(createProgramElementDocProxy(programElementDoc));
}
return (ProgramElementDocProxy[])programElementDocProxies.toArray(new ProgramElementDocProxy [0]);
}
public ProgramElementDocProxy createProgramElementDocProxy(Object object)
{
ProgramElementDocProxy programElementDocProxy = null;
if (object instanceof ProgramElementDocProxy)
{
programElementDocProxy = (ProgramElementDocProxy)object;
}
else
{
if (object instanceof ProgramElementDoc)
{
programElementDocProxy = createProgramElementDocProxy((ProgramElementDoc)object);
}
}
return programElementDocProxy;
}
public ProgramElementDocProxy createProgramElementDocProxy(ProgramElementDoc programElementDoc)
{
ProgramElementDocProxy proxy = null;
if (programElementDoc != null)
{
proxy = (ProgramElementDocProxy)getProxyRegistry().getProxyForObject(programElementDoc);
if (proxy == null)
{
if (programElementDoc instanceof ClassDoc)
{
proxy = createClassDocProxy((ClassDoc)programElementDoc);
}
else if (programElementDoc instanceof MemberDoc)
{
proxy = createMemberDocProxy((MemberDoc)programElementDoc);
}
else
{
proxy = new ProgramElementDocProxy(programElementDoc);
ProxyFactory.getInstance().getProxyRegistry().registerProxy(programElementDoc, proxy);
}
}
}
return proxy;
}
/*
* RootDoc Proxies
*/
public RootDocProxy createRootDocProxy(Object object)
{
RootDocProxy rootDocProxy = null;
if (object instanceof RootDocProxy)
{
rootDocProxy = (RootDocProxy)object;
}
else
{
if (object instanceof RootDoc)
{
rootDocProxy = createRootDocProxy((RootDoc)object);
}
}
return rootDocProxy;
}
public RootDocProxy createRootDocProxy(RootDoc rootDoc)
{
RootDocProxy proxy = null;
if (rootDoc != null)
{
proxy = (RootDocProxy)getProxyRegistry().getProxyForObject(rootDoc);
if (proxy == null)
{
proxy = new RootDocProxy(rootDoc);
ProxyFactory.getInstance().getProxyRegistry().registerProxy(rootDoc, proxy);
}
}
return proxy;
}
/*
* ClassDoc Proxies
*/
public ClassDocProxy[] createClassDocProxies(ClassDoc classDocs[])
{
ArrayList classDocProxies = new ArrayList();
for (int i = 0; i < classDocs.length; i++)
{
ClassDoc classDoc = classDocs[i];
classDocProxies.add(createClassDocProxy(classDoc));
}
return (ClassDocProxy[])classDocProxies.toArray(new ClassDocProxy [0]);
}
public ClassDocProxy createClassDocProxy(Object object)
{
ClassDocProxy classDocProxy = null;
if (object instanceof ClassDocProxy)
{
classDocProxy = (ClassDocProxy)object;
}
else
{
if (object instanceof ClassDoc)
{
classDocProxy = createClassDocProxy((ClassDoc)object);
}
}
return classDocProxy;
}
public ClassDocProxy createClassDocProxy(ClassDoc classDoc)
{
ClassDocProxy proxy = null;
if (classDoc != null)
{
proxy = (ClassDocProxy)getProxyRegistry().getProxyForObject(classDoc);
if (proxy == null)
{
proxy = new ClassDocProxy(classDoc);
ProxyFactory.getInstance().getProxyRegistry().registerProxy(classDoc, proxy);
}
}
return proxy;
}
/*
* MemberDoc Proxies
*/
public MemberDocProxy[] createMemberDocProxies(MemberDoc memberDocs[])
{
ArrayList memberDocProxies = new ArrayList();
for (int i = 0; i < memberDocs.length; i++)
{
MemberDoc memberDoc = memberDocs[i];
memberDocProxies.add(createMemberDocProxy(memberDoc));
}
return (MemberDocProxy[])memberDocProxies.toArray(new MemberDocProxy [0]);
}
public MemberDocProxy createMemberDocProxy(Object object)
{
MemberDocProxy memberDocProxy = null;
if (object instanceof MemberDocProxy)
{
memberDocProxy = (MemberDocProxy)object;
}
else
{
if (object instanceof MemberDoc)
{
memberDocProxy = createMemberDocProxy((MemberDoc)object);
}
}
return memberDocProxy;
}
public MemberDocProxy createMemberDocProxy(MemberDoc memberDoc)
{
MemberDocProxy proxy = null;
if (memberDoc != null)
{
proxy = (MemberDocProxy)getProxyRegistry().getProxyForObject(memberDoc);
if (proxy == null)
{
if (memberDoc instanceof ExecutableMemberDoc)
{
proxy = createExecutableMemberDocProxy((ExecutableMemberDoc)memberDoc);
}
else if (memberDoc instanceof FieldDoc)
{
proxy = createFieldDocProxy((FieldDoc)memberDoc);
}
else
{
proxy = new MemberDocProxy(memberDoc);
ProxyFactory.getInstance().getProxyRegistry().registerProxy(memberDoc, proxy);
}
}
}
return proxy;
}
/*
* ExecutableMemberDoc Proxies
*/
public ExecutableMemberDocProxy[] createExecutableMemberDocProxies(ExecutableMemberDoc executableMemberDocs[])
{
ArrayList executableMemberDocProxies = new ArrayList();
for (int i = 0; i < executableMemberDocs.length; i++)
{
ExecutableMemberDoc executableMemberDoc = executableMemberDocs[i];
executableMemberDocProxies.add(createExecutableMemberDocProxy(executableMemberDoc));
}
return (ExecutableMemberDocProxy[])executableMemberDocProxies.toArray(new ExecutableMemberDocProxy [0]);
}
public ExecutableMemberDocProxy createExecutableMemberDocProxy(Object object)
{
ExecutableMemberDocProxy executableMemberDocProxy = null;
if (object instanceof ExecutableMemberDocProxy)
{
executableMemberDocProxy = (ExecutableMemberDocProxy)object;
}
else
{
if (object instanceof ExecutableMemberDoc)
{
executableMemberDocProxy = createExecutableMemberDocProxy((ExecutableMemberDoc)object);
}
}
return executableMemberDocProxy;
}
public ExecutableMemberDocProxy createExecutableMemberDocProxy(ExecutableMemberDoc executableMemberDoc)
{
ExecutableMemberDocProxy proxy = null;
if (executableMemberDoc != null)
{
proxy = (ExecutableMemberDocProxy)getProxyRegistry().getProxyForObject(executableMemberDoc);
if (proxy == null)
{
if (executableMemberDoc instanceof ConstructorDoc)
{
proxy = createConstructorDocProxy((ConstructorDoc)executableMemberDoc);
}
else if (executableMemberDoc instanceof MethodDoc)
{
proxy = createMethodDocProxy((MethodDoc)executableMemberDoc);
}
else
{
proxy = new ExecutableMemberDocProxy(executableMemberDoc);
ProxyFactory.getInstance().getProxyRegistry().registerProxy(executableMemberDoc, proxy);
}
}
}
return proxy;
}
/*
* FieldDoc Proxies
*/
public FieldDocProxy[] createFieldDocProxies(FieldDoc fieldDocs[])
{
ArrayList fieldDocProxies = new ArrayList();
for (int i = 0; i < fieldDocs.length; i++)
{
FieldDoc fieldDoc = fieldDocs[i];
fieldDocProxies.add(createFieldDocProxy(fieldDoc));
}
return (FieldDocProxy[])fieldDocProxies.toArray(new FieldDocProxy [0]);
}
public FieldDocProxy createFieldDocProxy(Object object)
{
FieldDocProxy fieldDocProxy = null;
if (object instanceof FieldDocProxy)
{
fieldDocProxy = (FieldDocProxy)object;
}
else
{
if (object instanceof FieldDoc)
{
fieldDocProxy = createFieldDocProxy((FieldDoc)object);
}
}
return fieldDocProxy;
}
public FieldDocProxy createFieldDocProxy(FieldDoc fieldDoc)
{
FieldDocProxy proxy = null;
if (fieldDoc != null)
{
proxy = (FieldDocProxy)getProxyRegistry().getProxyForObject(fieldDoc);
if (proxy == null)
{
proxy = new FieldDocProxy(fieldDoc);
ProxyFactory.getInstance().getProxyRegistry().registerProxy(fieldDoc, proxy);
}
}
return proxy;
}
/*
* ContructorDoc Proxies
*/
public ConstructorDocProxy[] createConstructorDocProxies(ConstructorDoc constructorDocs[])
{
ArrayList constructorDocProxies = new ArrayList();
for (int i = 0; i < constructorDocs.length; i++)
{
ConstructorDoc constructorDoc = constructorDocs[i];
constructorDocProxies.add(createConstructorDocProxy(constructorDoc));
}
return (ConstructorDocProxy[])constructorDocProxies.toArray(new ConstructorDocProxy [0]);
}
public ConstructorDocProxy createConstructorDocProxy(Object object)
{
ConstructorDocProxy constructorDocProxy = null;
if (object instanceof ConstructorDocProxy)
{
constructorDocProxy = (ConstructorDocProxy)object;
}
else
{
if (object instanceof ConstructorDoc)
{
constructorDocProxy = createConstructorDocProxy((ConstructorDoc)object);
}
}
return constructorDocProxy;
}
public ConstructorDocProxy createConstructorDocProxy(ConstructorDoc constructorDoc)
{
ConstructorDocProxy proxy = null;
if (constructorDoc != null)
{
proxy = (ConstructorDocProxy)getProxyRegistry().getProxyForObject(constructorDoc);
if (proxy == null)
{
proxy = new ConstructorDocProxy(constructorDoc);
ProxyFactory.getInstance().getProxyRegistry().registerProxy(constructorDoc, proxy);
}
}
return proxy;
}
/*
* MethodDoc Proxies
*/
public MethodDocProxy[] createMethodDocProxies(MethodDoc methodDocs[])
{
ArrayList methodDocProxies = new ArrayList();
for (int i = 0; i < methodDocs.length; i++)
{
MethodDoc methodDoc = methodDocs[i];
methodDocProxies.add(createMethodDocProxy(methodDoc));
}
return (MethodDocProxy[])methodDocProxies.toArray(new MethodDocProxy [0]);
}
public MethodDocProxy createMethodDocProxy(Object object)
{
MethodDocProxy methodDocProxy = null;
if (object instanceof MethodDocProxy)
{
methodDocProxy = (MethodDocProxy)object;
}
else
{
if (object instanceof MethodDoc)
{
methodDocProxy = createMethodDocProxy((MethodDoc)object);
}
}
return methodDocProxy;
}
public MethodDocProxy createMethodDocProxy(MethodDoc methodDoc)
{
MethodDocProxy proxy = null;
if (methodDoc != null)
{
proxy = (MethodDocProxy)getProxyRegistry().getProxyForObject(methodDoc);
if (proxy == null)
{
proxy = new MethodDocProxy(methodDoc);
ProxyFactory.getInstance().getProxyRegistry().registerProxy(methodDoc, proxy);
}
}
return proxy;
}
/*
* Parameter Proxies
*/
public ParameterProxy[] createParameterProxies(Parameter parameters[])
{
ArrayList parameterProxies = new ArrayList();
for (int i = 0; i < parameters.length; i++)
{
Parameter parameter = parameters[i];
parameterProxies.add(createParameterProxy(parameter));
}
return (ParameterProxy[])parameterProxies.toArray(new ParameterProxy [0]);
}
public ParameterProxy createParameterProxy(Object object)
{
ParameterProxy parameterProxy = null;
if (object instanceof ParameterProxy)
{
parameterProxy = (ParameterProxy)object;
}
else
{
if (object instanceof Parameter)
{
parameterProxy = createParameterProxy((Parameter)object);
}
}
return parameterProxy;
}
public ParameterProxy createParameterProxy(Parameter parameter)
{
ParameterProxy proxy = null;
if (parameter != null)
{
proxy = (ParameterProxy)getProxyRegistry().getProxyForObject(parameter);
if (proxy == null)
{
proxy = new ParameterProxy(parameter);
ProxyFactory.getInstance().getProxyRegistry().registerProxy(parameter, proxy);
}
}
return proxy;
}
/*
* Type Proxies
*/
public Proxy[] createTypeProxies(Type types[])
{
ArrayList typeProxies = new ArrayList();
for (int i = 0; i < types.length; i++)
{
Type type = types[i];
typeProxies.add(createTypeProxy(type));
}
return (Proxy[])typeProxies.toArray(new Proxy [0]);
}
public Proxy createTypeProxy(Object object)
{
Proxy typeProxy = null;
if (object instanceof TypeProxy)
{
typeProxy = (TypeProxy)object;
}
else
{
if (object instanceof Type)
{
typeProxy = createTypeProxy((Type)object);
}
}
return typeProxy;
}
public Proxy createTypeProxy(Type type)
{
Proxy proxy = null;
if (type != null)
{
proxy = getProxyRegistry().getProxyForObject(type);
if (proxy == null)
{
if (type instanceof ClassDoc)
{
proxy = new ClassDocProxy((ClassDoc)type);
}
else
{
proxy = new TypeProxy(type);
}
ProxyFactory.getInstance().getProxyRegistry().registerProxy(type, proxy);
}
}
return proxy;
}
/*
* Tag Proxies
*/
public TagProxy[] createTagProxies(Tag tags[])
{
ArrayList tagProxies = new ArrayList();
for (int i = 0; i < tags.length; i++)
{
Tag tag = tags[i];
tagProxies.add(createTagProxy(tag));
}
return (TagProxy[])tagProxies.toArray(new TagProxy [0]);
}
public TagProxy createTagProxy(Object object)
{
TagProxy tagProxy = null;
if (object instanceof TagProxy)
{
tagProxy = (TagProxy)object;
}
else
{
if (object instanceof Tag)
{
tagProxy = createTagProxy((Tag)object);
}
}
return tagProxy;
}
public TagProxy createTagProxy(Tag tag)
{
TagProxy proxy = null;
if (tag != null)
{
proxy = (TagProxy)getProxyRegistry().getProxyForObject(tag);
if (proxy == null)
{
if (tag instanceof ParamTag)
{
proxy = createParamTagProxy((ParamTag)tag);
}
else if (tag instanceof SeeTag)
{
proxy = createSeeTagProxy((SeeTag)tag);
}
else if (tag instanceof SerialFieldTag)
{
proxy = createSerialFieldTagProxy((SerialFieldTag)tag);
}
else if (tag instanceof ThrowsTag)
{
proxy = createThrowsTagProxy((ThrowsTag)tag);
}
else
{
proxy = new TagProxy(tag);
}
ProxyFactory.getInstance().getProxyRegistry().registerProxy(tag, proxy);
}
}
return proxy;
}
/*
* ParamTag Proxies
*/
public ParamTagProxy[] createParamTagProxies(ParamTag paramTags[])
{
ArrayList paramTagProxies = new ArrayList();
for (int i = 0; i < paramTags.length; i++)
{
ParamTag paramTag = paramTags[i];
paramTagProxies.add(createParamTagProxy(paramTag));
}
return (ParamTagProxy[])paramTagProxies.toArray(new ParamTagProxy [0]);
}
public ParamTagProxy createParamTagProxy(Object object)
{
ParamTagProxy paramTagProxy = null;
if (object instanceof ParamTagProxy)
{
paramTagProxy = (ParamTagProxy)object;
}
else
{
if (object instanceof ParamTag)
{
paramTagProxy = createParamTagProxy((ParamTag)object);
}
}
return paramTagProxy;
}
public ParamTagProxy createParamTagProxy(ParamTag paramTag)
{
ParamTagProxy proxy = null;
if (paramTag != null)
{
proxy = (ParamTagProxy)getProxyRegistry().getProxyForObject(paramTag);
if (proxy == null)
{
proxy = new ParamTagProxy(paramTag);
ProxyFactory.getInstance().getProxyRegistry().registerProxy(paramTag, proxy);
}
}
return proxy;
}
/*
* SeeTag Proxies
*/
public SeeTagProxy[] createSeeTagProxies(SeeTag seeTags[])
{
ArrayList seeTagProxies = new ArrayList();
for (int i = 0; i < seeTags.length; i++)
{
SeeTag seeTag = seeTags[i];
seeTagProxies.add(createSeeTagProxy(seeTag));
}
return (SeeTagProxy[])seeTagProxies.toArray(new SeeTagProxy [0]);
}
public SeeTagProxy createSeeTagProxy(Object object)
{
SeeTagProxy seeTagProxy = null;
if (object instanceof SeeTagProxy)
{
seeTagProxy = (SeeTagProxy)object;
}
else
{
if (object instanceof SeeTag)
{
seeTagProxy = createSeeTagProxy((SeeTag)object);
}
}
return seeTagProxy;
}
public SeeTagProxy createSeeTagProxy(SeeTag seeTag)
{
SeeTagProxy proxy = null;
if (seeTag != null)
{
proxy = (SeeTagProxy)getProxyRegistry().getProxyForObject(seeTag);
if (proxy == null)
{
proxy = new SeeTagProxy(seeTag);
ProxyFactory.getInstance().getProxyRegistry().registerProxy(seeTag, proxy);
}
}
return proxy;
}
/*
* ThrowsTag Proxies
*/
public ThrowsTagProxy[] createThrowsTagProxies(ThrowsTag throwsTags[])
{
ArrayList throwsTagProxies = new ArrayList();
for (int i = 0; i < throwsTags.length; i++)
{
ThrowsTag throwsTag = throwsTags[i];
throwsTagProxies.add(createThrowsTagProxy(throwsTag));
}
return (ThrowsTagProxy[])throwsTagProxies.toArray(new ThrowsTagProxy [0]);
}
public ThrowsTagProxy createThrowsTagProxy(Object object)
{
ThrowsTagProxy throwsTagProxy = null;
if (object instanceof ThrowsTagProxy)
{
throwsTagProxy = (ThrowsTagProxy)object;
}
else
{
if (object instanceof ThrowsTag)
{
throwsTagProxy = createThrowsTagProxy((ThrowsTag)object);
}
}
return throwsTagProxy;
}
public ThrowsTagProxy createThrowsTagProxy(ThrowsTag throwsTag)
{
ThrowsTagProxy proxy = null;
if (throwsTag != null)
{
proxy = (ThrowsTagProxy)getProxyRegistry().getProxyForObject(throwsTag);
if (proxy == null)
{
proxy = new ThrowsTagProxy(throwsTag);
ProxyFactory.getInstance().getProxyRegistry().registerProxy(throwsTag, proxy);
}
}
return proxy;
}
/*
* SerialFieldTag Proxies
*/
public SerialFieldTagProxy[] createSerialFieldTagProxies(SerialFieldTag serialFieldTags[])
{
ArrayList serialFieldTagProxies = new ArrayList();
for (int i = 0; i < serialFieldTags.length; i++)
{
SerialFieldTag serialFieldTag = serialFieldTags[i];
serialFieldTagProxies.add(createSerialFieldTagProxy(serialFieldTag));
}
return (SerialFieldTagProxy[])serialFieldTagProxies.toArray(new SerialFieldTagProxy [0]);
}
public SerialFieldTagProxy createSerialFieldTagProxy(Object object)
{
SerialFieldTagProxy serialFieldTagProxy = null;
if (object instanceof SerialFieldTagProxy)
{
serialFieldTagProxy = (SerialFieldTagProxy)object;
}
else
{
if (object instanceof SerialFieldTag)
{
serialFieldTagProxy = createSerialFieldTagProxy((SerialFieldTag)object);
}
}
return serialFieldTagProxy;
}
public SerialFieldTagProxy createSerialFieldTagProxy(SerialFieldTag serialFieldTag)
{
SerialFieldTagProxy proxy = null;
if (serialFieldTag != null)
{
proxy = (SerialFieldTagProxy)getProxyRegistry().getProxyForObject(serialFieldTag);
if (proxy == null)
{
proxy = new SerialFieldTagProxy(serialFieldTag);
ProxyFactory.getInstance().getProxyRegistry().registerProxy(serialFieldTag, proxy);
}
}
return proxy;
}
private ProxyFactory()
{
proxyRegistry = new ProxyRegistry();
}
/* package */ProxyRegistry getProxyRegistry()
{
return proxyRegistry;
}
}