alvinalexander.com | career | drupal | java | mac | mysql | perl | scala | uml | unix  

What this is

This file is included in the DevDaily.com "Java Source Code Warehouse" project. The intent of this project is to help you "Learn Java by Example" TM.

Other links

The source code

/*
 *                 Sun Public License Notice
 *
 * The contents of this file are subject to the Sun Public License
 * Version 1.0 (the "License"). You may not use this file except in
 * compliance with the License. A copy of the License is available at
 * http://www.sun.com/
 *
 * The Original Code is NetBeans. The Initial Developer of the Original
 * Code is Sun Microsystems, Inc. Portions Copyright 1997-2003 Sun
 * Microsystems, Inc. All Rights Reserved.
 */
/*
 * Cloner.java
 *
 * Created on 05 December 2003, 09:32
 */

package org.netbeans.jmi.javamodel.regenerator;

import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
import org.netbeans.jmi.javamodel.*;
import org.netbeans.modules.javacore.internalapi.JavaMetamodel;
import org.openide.filesystems.FileSystem;


/**
 *
 * @author Jan Becicka
 */
public class Cloner {
    
    private JavaModelPackage target;
    private FileSystem targetFS;
    private boolean useJavadoc = Boolean.getBoolean("org.netbeans.javacore.useJavadoc");
    private boolean useBody = Boolean.getBoolean("org.netbeans.javacore.useBody");
    private boolean useInitialValue = Boolean.getBoolean("org.netbeans.javacore.useInitialValue");
    
    /** Creates a new instance of Cloner */
    public Cloner(FileSystem targetFS) {
        System.out.println(useBody);
        this.targetFS = targetFS;
        target = JavaMetamodel.getManager().resolveJavaExtent(targetFS.getRoot());
    }
    
    public Resource duplicate(Resource resource) {
        Resource result = target.getResource().createResource(
          resource.getName(),
          resource.getTimestamp(),
          duplicate(resource.getClassifiers()),
          duplicate(resource.getImports()),
          resource.getPackageName(),
          null
          );
        return result;
    }
    
    public List duplicate(List list) {
        if (list == null)
            return null;
        
        if (list.isEmpty())
            return new ArrayList(0);
        
        Iterator it = list.iterator();
        List result = new ArrayList();
        
        while (it.hasNext()) {
            result.add(duplicate(it.next()));
        }
        
        return result;
    }
    
    
    public Parameter duplicate(Parameter param) {
        Parameter result;
        result = target.getParameter().createParameter(
            param.getName(),
            duplicate(param.getAnnotations()),
            param.isFinal(),
            (TypeReference) duplicate(param.getTypeName()),
            param.getDimCount(),
            param.isVarArg()
         );
        //result.setType(param.getType());
        
        return result;
    }
    
    public Initializer duplicate(Initializer init) {
        
        Initializer newinit;
        
        newinit = target.getInitializer().createInitializer(
          init.getName(),
          duplicate(init.getAnnotations()),
          init.getModifiers(),
          useJavadoc?null:init.getJavadocText(),
          useJavadoc?duplicate(init.getJavadoc()):null,
          useBody?duplicate(init.getBody()):null,
          useBody?null:init.getBodyText()
         );
        
        return newinit;
    }
    

    public Import duplicate(Import imp) {
        return target.getImport().createImport(imp.getName(), null, imp.isStatic(), imp.isOnDemand());
    }
    
    public JavaClass duplicate(JavaClass clazz) {
        if (clazz == null)
            return null;

        JavaClass newclazz;
        
        newclazz = target.getJavaClass().createJavaClass(
          clazz.getName(),
          duplicate(clazz.getAnnotations()),
          clazz.getModifiers(),
          useJavadoc?null:clazz.getJavadocText(),
          useJavadoc?duplicate(clazz.getJavadoc()):null,
          duplicate(clazz.getFeatures()),
          duplicate(clazz.getSuperClassName()),
          duplicate(clazz.getInterfaceNames()),
          duplicate(clazz.getTypeParameters())
         );
          
        //newclazz.setInterface(clazz.isInterface());
        //newclazz.setSuperClass(clazz.getSuperClass());
        
        return newclazz;
    }
    
    public Constructor duplicate(Constructor constructor) {

        Constructor newcon;

        newcon = target.getConstructor().createConstructor(
          constructor.getName(),
          duplicate(constructor.getAnnotations()),
          constructor.getModifiers(),
          useJavadoc?null:constructor.getJavadocText(),
          useJavadoc?duplicate(constructor.getJavadoc()):null,
          useBody?duplicate(constructor.getBody()):null,
          useBody?null:constructor.getBodyText(),
          duplicate(constructor.getTypeParameters()),
          duplicate(constructor.getParameters()),
          duplicate(constructor.getExceptionNames())
        );

        //newcon.getExceptions().addAll(constructor.getExceptions());

        return newcon;

        /*
        does not work this way!!!???

        Constructor newcon;

        newcon = target.getConstructor().createConstructor();
        //newcon.setName(constructor.getName());

        //TODO: use setBody instead of setBodyText
        if (constructor.getBodyText() != null)
           newcon.setBodyText(constructor.getBodyText());

        //TODO: use setJavadoc instead of setJavadocText
        if (constructor.getJavadocText() != null)
           newcon.setJavadocText(constructor.getJavadocText());

        newcon.setModifiers(constructor.getModifiers());
        newcon.setType(constructor.getType());
        newcon.getParameters().addAll(constructor.getParameters());
        newcon.getExceptions().addAll(constructor.getExceptions());
        return newcon;
         */
    }
    
    public Method duplicate(Method method) {
        Method newmet;

        newmet = target.getMethod().createMethod(
        method.getName(),
        duplicate(method.getAnnotations()),
        method.getModifiers(),
        useJavadoc?null:method.getJavadocText(),
        useJavadoc?duplicate(method.getJavadoc()):null,
        useBody?duplicate(method.getBody()):null,
        useBody?null:method.getBodyText(),
        duplicate(method.getTypeParameters()),
        duplicate(method.getParameters()),
        duplicate(method.getExceptionNames()),
        (TypeReference) duplicate(method.getTypeName()),
        method.getDimCount()
        );

        //newmet.setType(method.getType());
        //newmet.getExceptions().addAll(method.getExceptions());

        return newmet;


        /*
        does not work this way!!!???

        Method newmet;

        newmet = target.getMethod().createMethod();
        newmet.setName(method.getName());

        //TODO: use setBody instead of setBodyText
        if (newmet.getBodyText() != null)
           newmet.setBodyText(method.getBodyText());

        //TODO: use setJavadoc instead of setJavadocText
        if (newmet.getJavadocText() != null)
           newmet.setJavadocText(method.getJavadocText());

        newmet.setModifiers(method.getModifiers());
        newmet.setType(method.getType());
        newmet.getParameters().addAll(method.getParameters());
        newmet.getExceptions().addAll(method.getExceptions());

        return newmet;
         */
    }
    
    public Field duplicate(Field field) {
        Field newfield;
        
        newfield = target.getField().createField(
          field.getName(), 
          duplicate(field.getAnnotations()),
          field.getModifiers(),
          useJavadoc?null:field.getJavadocText(),
          useJavadoc?duplicate(field.getJavadoc()):null,
          field.isFinal(),
          (TypeReference) duplicate(field.getTypeName()),
          field.getDimCount(),
          useInitialValue?(InitialValue)duplicate(field.getInitialValue()):null,
          useInitialValue?null:field.getInitialValueText()
        );

        newfield.setType(field.getType());
        
        return newfield;

        /*
         * does not work this way
        
        Field newfield;
        
        newfield = target.getField().createField();
        newfield.setName(field.getName());
        
        //TODO: use setJavadoc instead of setJavadocText
        if (field.getJavadocText() != null)
            newfield.setJavadocText(field.getJavadocText());   
        
        newfield.setModifiers(field.getModifiers());
        newfield.setType(field.getType());
        
        //TODO: use setInitialValue instead of setInitialValue
        if (newfield.getInitialValueText() != null)
            newfield.setInitialValueText(field.getInitialValueText());
        
        return newfield;
         */
    }
    
    public JavaDoc duplicate(JavaDoc javadoc) {
        if (javadoc == null)
            return null;
        return target.getJavaDoc().createJavaDoc(javadoc.getText(), duplicate(javadoc.getTags()));
    }
    
    public TagValue duplicate(TagValue elem){
        TagValue val = target.getTagValue().createTagValue(elem.getValue());
        val.setDefinition(duplicate(elem.getDefinition()));
        return val;
    }
    
    public TagDefinition duplicate(TagDefinition elem){
        if (elem == null)
            return null;
        return target.getTagDefinition().createTagDefinition(elem.getName());
    }
    
    //Statements

    public StatementBlock duplicate (StatementBlock statement) {
        return target.getStatementBlock().createStatementBlock(duplicate(statement.getStatements()));
    }
    
    public  LabeledStatement duplicate(LabeledStatement elem) {
        return target.getLabeledStatement().createLabeledStatement(
           elem.getLabel(),
          (Statement) duplicate(elem.getBody())
        );
    }
    
    public  WhileStatement duplicate(WhileStatement elem) {
        return target.getWhileStatement().createWhileStatement(
          (Expression)duplicate(elem.getExpression()),
          (Statement) duplicate(elem.getBody())
        );
    }
    
    public  DoStatement duplicate(DoStatement elem) {
        return target.getDoStatement().createDoStatement(
          (Expression) duplicate(elem.getExpression()),
          (Statement) duplicate(elem.getBody())
        );
    }
    
    public  IfStatement duplicate(IfStatement elem) {
        return target.getIfStatement().createIfStatement(
          (Expression) duplicate(elem.getExpression()),
          (Statement) duplicate(elem.getThenPart()), 
          (Statement) duplicate(elem.getElsePart())
          );
    }
    
    public  AssertStatement duplicate(AssertStatement elem) {
        return target.getAssertStatement().createAssertStatement(
          (Expression) duplicate(elem.getExpression()),
          (Expression) duplicate(elem.getDetail())
        );
    }
    
    public  TryStatement duplicate(TryStatement elem) {
        return target.getTryStatement().createTryStatement(
          duplicate(elem.getBody()),
          duplicate(elem.getCatches()), 
          duplicate(elem.getFinalizer())
          );
    }
    
    public  ConstructorInvocation duplicate(ConstructorInvocation elem) {
        return target.getConstructorInvocation().createConstructorInvocation(
          elem.isHasSuper(),
          (PrimaryExpression) duplicate(elem.getParentClass()),
          duplicate(elem.getParameters())
          );
    }
    
    public  BreakStatement duplicate(BreakStatement elem) {
        return target.getBreakStatement().createBreakStatement(elem.getLabel());
    }
    
    
    public  ForStatement duplicate(ForStatement elem) {
        return target.getForStatement().createForStatement(
          (Expression) duplicate(elem.getExpression()),
          duplicate(elem.getSteps()),
          (Statement) duplicate(elem.getBody()),
          duplicate(elem.getInit())
          );
    }
    
    
    public LocalVariable duplicate(LocalVariable elem) {
        LocalVariable var = target.getLocalVariable().createLocalVariable(
          elem.getName(),
          //duplicate(elem.getAnnotations()),
          null, 
          elem.isFinal(),
          null,
          elem.getDimCount(),
          useInitialValue?(InitialValue)duplicate(elem.getInitialValue()):null,
          useInitialValue?null:elem.getInitialValueText()
        );
        var.setType(elem.getType());
        return var;
    }

    public  ContinueStatement duplicate(ContinueStatement elem) {
        return target.getContinueStatement().createContinueStatement(elem.getLabel());
    }
    
    
    public  LocalVarDeclaration duplicate(LocalVarDeclaration elem) {
        LocalVarDeclaration result = target.getLocalVarDeclaration().createLocalVarDeclaration(
            elem.isFinal(),
            (TypeReference) duplicate(elem.getTypeName()),
            duplicate(elem.getVariables()));
        //result.setType(elem.getType());
        return result;
    }
    
    
    public  EmptyStatement duplicate(EmptyStatement elem) {
        return target.getEmptyStatement().createEmptyStatement();
    }
    
    
    public  ReturnStatement duplicate(ReturnStatement elem) {
        return target.getReturnStatement().createReturnStatement((Expression) duplicate(elem.getExpression()));
    }
    
    
    public  ForEachStatement duplicate(ForEachStatement elem) {
        return target.getForEachStatement().createForEachStatement(
          (Statement) duplicate(elem.getBody()),
          duplicate(elem.getParameter()),
          (Expression) duplicate(elem.getIterable())
          );
    }
    
    
    public SwitchStatement duplicate(SwitchStatement elem) {
        return target.getSwitchStatement().createSwitchStatement(
          (Expression) duplicate(elem.getExpression()),
          duplicate(elem.getCases())); 
    }
    
    
    public  SynchronizedStatement duplicate(SynchronizedStatement elem) {
        return target.getSynchronizedStatement().createSynchronizedStatement(
          (Expression) duplicate(elem.getLock()),
          duplicate(elem.getBody())
        );
    }
    
    
    public  ThrowStatement duplicate(ThrowStatement elem) {
        return target.getThrowStatement().createThrowStatement((Expression) duplicate(elem.getExpression()));
    }
    
    
    
    //Expressions
    
    public  Annotation duplicate(Annotation elem) {
        Annotation result = target.getAnnotation().createAnnotation(elem.getName(), duplicate(elem.getAttributeValues()));
        result.setDefinition(elem.getDefinition());
        return result;
    }
    
    
    public  ArrayInitialization duplicate(ArrayInitialization elem) {
        if (elem == null)
            return null;
        ArrayInitialization result = target.getArrayInitialization().createArrayInitialization(duplicate(elem.getElementValues()));
        return result;
    }
    
    
    public  Assignment duplicate(Assignment elem) {
        return target.getAssignment().createAssignment(
          (PrimaryExpression) duplicate(elem.getLeftSide()),
          elem.getOperator(),
          (Expression) duplicate(elem.getRightSide())
          );
    }
    
    
    public  InfixExpression duplicate(InfixExpression elem) {
        return target.getInfixExpression().createInfixExpression(
          (Expression) duplicate(elem.getLeftSide()),
          elem.getOperator(),
          (Expression) duplicate(elem.getRightSide())
        );
    }
    
    
    public  ConditionalExpression duplicate(ConditionalExpression elem) {
        return target.getConditionalExpression().createConditionalExpression(
          (Expression)duplicate(elem.getCondition()),
          (Expression)duplicate(elem.getTruePart()),
          (Expression)duplicate(elem.getFalsePart())
        );
    }
    
    
    public  TypeCast duplicate(TypeCast elem) {
        return target.getTypeCast().createTypeCast((TypeReference) duplicate(elem.getTypeName()), (Expression) duplicate(elem.getExpression()));
    }
    
    
    public  PrefixExpression duplicate(PrefixExpression elem) {
        return target.getPrefixExpression().createPrefixExpression(
          elem.getOperator(),
          (UnaryExpression) duplicate(elem.getExpression())
        );
    }
    
    
    public  Literal duplicate(Literal elem) {
        if (elem instanceof IntLiteral)
            return target.getIntLiteral().createIntLiteral(((IntLiteral) elem).getValue());

        if (elem instanceof StringLiteral)
            return target.getStringLiteral().createStringLiteral(((StringLiteral) elem).getValue());
        
        if (elem instanceof BooleanLiteral)
            return target.getBooleanLiteral().createBooleanLiteral(((BooleanLiteral) elem).isValue());
        
        if (elem instanceof CharLiteral)
            return target.getCharLiteral().createCharLiteral(((CharLiteral) elem).getValue());
        
        if (elem instanceof NullLiteral)
            return target.getNullLiteral().createNullLiteral();
        
        throw new IllegalArgumentException("unknow type to duplicate: " + elem.getClass().getName());
    }
    
    
    public  ThisExpression duplicate(ThisExpression elem) {
        return target.getThisExpression().createThisExpression();
    }
    
    
    public  ComplexExpression duplicate(ComplexExpression elem) {
        return target.getComplexExpression().createComplexExpression((Expression) duplicate(elem.getExpression()));
    }
    
    
    public  ClassExpression duplicate(ClassExpression elem) {
        return target.getClassExpression().createClassExpression();
    }
    
    
    public  PostfixExpression duplicate(PostfixExpression elem) {
        return target.getPostfixExpression().createPostfixExpression(
          elem.getOperator(), 
          (UnaryExpression) duplicate(elem.getExpression())
        ); 
    }
    
    
    public  ArrayAccess duplicate(ArrayAccess elem) {
        return target.getArrayAccess().createArrayAccess(
          (PrimaryExpression) duplicate(elem.getArray()),
          (Expression) duplicate(elem.getIndex())
        );
    }
    
    
    public  NewArrayExpression duplicate(NewArrayExpression elem) {
        return target.getNewArrayExpression().createNewArrayExpression(
          duplicate(elem.getTypeName()),
          duplicate(elem.getDimensions()),
          elem.getDimCount(),
          duplicate(elem.getInitializer())
        );  
    }
    
    
    public  VariableAccess duplicate(VariableAccess elem) {
        return target.getVariableAccess().createVariableAccess(
          elem.getName(),
          (PrimaryExpression) duplicate(elem.getParentClass()),
          elem.isHasSuper()
        );
    }
    
    
    public  MultipartId duplicate(MultipartId elem) {
        if (elem == null) return null;
        return target.getMultipartId().createMultipartId(elem.getName(), duplicate(elem.getParent()), null);
    }
    
    public ArrayReference duplicate(ArrayReference elem) {
        return target.getArrayReference().createArrayReference(elem.getName(), duplicate(elem.getParent()), elem.getDimCount());
    }

    public  MethodInvocation duplicate(MethodInvocation elem) {
        return target.getMethodInvocation().createMethodInvocation(
          elem.getName(),
          duplicate(elem.getParameters()), 
          (PrimaryExpression) duplicate(elem.getParentClass()),
          elem.isHasSuper()
        );
    }
    
    
    public  NewClassExpression duplicate(NewClassExpression elem) {
        return target.getNewClassExpression().createNewClassExpression(
          elem.getName(), 
          duplicate(elem.getParameters()),
          (PrimaryExpression) duplicate(elem.getEnclosingClass()),
          duplicate(elem.getClassName()),
          (ClassDefinition) duplicate(elem.getClassDefinition())
        );
    }
    
    public Object duplicate(Object elem) {
        System.out.println("duplicating " + elem);
        if (elem == null)
            return null;
        
        if (elem instanceof Import)
            return duplicate((Import) elem);
        
        if (elem instanceof JavaClass)
            return duplicate((JavaClass) elem);
        
        if (elem instanceof Method)
            return duplicate((Method) elem);
        
        if (elem instanceof Constructor)
            return duplicate((Constructor) elem);
        
        if (elem instanceof Field)
            return duplicate((Field) elem);
        
        if (elem instanceof Initializer)
            return duplicate((Initializer) elem);
        
        if (elem instanceof Parameter)
            return duplicate((Parameter) elem);
        
        if (elem instanceof Annotation)
            return duplicate((Annotation) elem);
        
        if (elem instanceof ArrayInitialization)
            return duplicate((ArrayInitialization) elem);
        
        if (elem instanceof Assignment)
            return duplicate((Assignment) elem);
        
        if (elem instanceof InfixExpression)
            return duplicate((InfixExpression) elem);
        
        if (elem instanceof ConditionalExpression)
            return duplicate((ConditionalExpression) elem);
        
        if (elem instanceof TypeCast)
            return duplicate((TypeCast) elem);
        
        if (elem instanceof PrefixExpression)
            return duplicate((PrefixExpression) elem);
        
        if (elem instanceof Literal)
            return duplicate((Literal) elem);
        
        if (elem instanceof ThisExpression)
            return duplicate((ThisExpression) elem);
        
        if (elem instanceof ComplexExpression)
            return duplicate((ComplexExpression) elem);
        
        if (elem instanceof ClassExpression)
            return duplicate((ClassExpression) elem);
        
        if (elem instanceof PostfixExpression)
            return duplicate((PostfixExpression) elem);
        
        if (elem instanceof ArrayAccess )
            return duplicate((ArrayAccess) elem);
        
        if (elem instanceof NewArrayExpression)
            return duplicate((NewArrayExpression) elem);
        
        if (elem instanceof VariableAccess)
            return duplicate((VariableAccess) elem);
        
        if (elem instanceof MultipartId)
            return duplicate((MultipartId) elem);
        
        if (elem instanceof MethodInvocation )
            return duplicate((MethodInvocation) elem);
        
        if (elem instanceof NewClassExpression)
            return duplicate((NewClassExpression) elem);
        
        if (elem instanceof LabeledStatement)
            return duplicate((LabeledStatement) elem);
        
        if (elem instanceof WhileStatement)
            return duplicate((WhileStatement) elem);
        
        if (elem instanceof DoStatement)
            return duplicate((DoStatement) elem);
        
        if (elem instanceof IfStatement)
            return duplicate((IfStatement) elem);
        
        if (elem instanceof AssertStatement)
            return duplicate((AssertStatement) elem);
        
        if (elem instanceof TryStatement)
            return duplicate((TryStatement) elem);
        
        if (elem instanceof ConstructorInvocation)
            return duplicate((ConstructorInvocation) elem);
        
        if (elem instanceof BreakStatement)
            return duplicate((BreakStatement) elem);
        
        if (elem instanceof ForStatement)
            return duplicate((ForStatement) elem);
        
        if (elem instanceof ContinueStatement)
            return duplicate((ContinueStatement) elem);
        
        if (elem instanceof LocalVarDeclaration)
            return duplicate((LocalVarDeclaration) elem);
        
        if (elem instanceof EmptyStatement)
            return duplicate((EmptyStatement) elem);
        
        if (elem instanceof ReturnStatement)
            return duplicate((ReturnStatement) elem);
        
        if (elem instanceof ForEachStatement)
            return duplicate((ForEachStatement) elem);
        
        if (elem instanceof SwitchStatement)
            return duplicate((SwitchStatement) elem);
        
        if (elem instanceof SynchronizedStatement)
            return duplicate((SynchronizedStatement) elem);
        
        if (elem instanceof ThrowStatement)
            return duplicate((ThrowStatement) elem);
        
        if (elem instanceof StatementBlock)
            return duplicate((StatementBlock) elem);
        
        if (elem instanceof SynchronizedStatement)
            return duplicate((SynchronizedStatement) elem);
        
        if (elem instanceof SynchronizedStatement)
            return duplicate((SynchronizedStatement) elem);
        
        if (elem instanceof TagValue)
            return duplicate((TagValue) elem);
        
        if (elem instanceof LocalVariable)
            return duplicate((LocalVariable) elem);
        
        if (elem instanceof ArrayReference)
            return duplicate((ArrayReference) elem);
        
        throw new IllegalArgumentException("unknow type to duplicate: " + elem.getClass().getName());
    }
}
... this post is sponsored by my books ...

#1 New Release!

FP Best Seller

 

new blog posts

 

Copyright 1998-2021 Alvin Alexander, alvinalexander.com
All Rights Reserved.

A percentage of advertising revenue from
pages under the /java/jwarehouse URI on this website is
paid back to open source projects.