KickJava   Java API By Example, From Geeks To Geeks.

Java > Open Source Codes > org > netbeans > modules > javacore > jmiimpl > javamodel > NewArrayExpressionImpl


1 /*
2  * The contents of this file are subject to the terms of the Common Development
3  * and Distribution License (the License). You may not use this file except in
4  * compliance with the License.
5  *
6  * You can obtain a copy of the License at http://www.netbeans.org/cddl.html
7  * or http://www.netbeans.org/cddl.txt.
8  *
9  * When distributing Covered Code, include this CDDL Header Notice in each file
10  * and include the License file at http://www.netbeans.org/cddl.txt.
11  * If applicable, add the following below the CDDL Header, with the fields
12  * enclosed by brackets [] replaced by your own identifying information:
13  * "Portions Copyrighted [year] [name of copyright owner]"
14  *
15  * The Original Software is NetBeans. The Initial Developer of the Original
16  * Software is Sun Microsystems, Inc. Portions Copyright 1997-2006 Sun
17  * Microsystems, Inc. All Rights Reserved.
18  */

19 package org.netbeans.modules.javacore.jmiimpl.javamodel;
20
21 import org.netbeans.jmi.javamodel.*;
22 import org.netbeans.lib.java.parser.ASTree;
23 import org.netbeans.lib.java.parser.ASTreeTypes;
24 import org.netbeans.mdr.storagemodel.StorableObject;
25 import org.netbeans.modules.javacore.parser.ASTProvider;
26 import java.util.*;
27
28 /**
29  *
30  * @author Martin Matula
31  */

32 public abstract class NewArrayExpressionImpl extends ExpressionImpl implements NewArrayExpression {
33     private ArrayInitialization initializer;
34     private LightAttrList dimensions;
35     private MultipartId typeName;
36     private int dimCount;
37
38     /** Creates a new instance of NewArrayExpressionImpl */
39     public NewArrayExpressionImpl(StorableObject o) {
40         super(o);
41     }
42
43     public MultipartId getTypeName() {
44         if (!childrenInited) {
45             initChildren();
46         }
47         return typeName;
48     }
49
50     public void setTypeName(MultipartId typeName) {
51         objectChanged(CHANGED_TYPE);
52         changeChild(getTypeName(), typeName);
53         this.typeName = typeName;
54     }
55
56     public Type getType() {
57         Type t = (Type) getTypeName().getElement();
58         int dims = getDimCount();
59         ArrayClass arrayClass = ((JavaModelPackage)t.refImmediatePackage()).getArray();
60         for (int i = 0; i < dims; i++) {
61             t = arrayClass.resolveArray(t);
62         }
63         return t;
64     }
65     
66     public void setType(Type newValue) {
67         MultipartIdClass proxy = ((JavaModelPackage) refImmediatePackage()).getMultipartId();
68         setTypeName(proxy.createMultipartId(newValue.getName(), null, null));
69     }
70     
71     public int getDimCount() {
72         if (isChanged(CHANGED_DIM_COUNT)) {
73             return dimCount;
74         } else {
75             ASTree dims = getASTree().getSubTrees()[2];
76             int dimSize = dims == null ? 0 : (dims.getLastToken() - dims.getFirstToken() + 1) / 2;
77             return getDimensions().size() + dimSize;
78         }
79     }
80
81     public void setDimCount(int dimCount) {
82         objectChanged(CHANGED_DIM_COUNT);
83         this.dimCount = dimCount;
84     }
85
86     public ArrayInitialization getInitializer() {
87         if (!childrenInited) {
88             initChildren();
89         }
90         return initializer;
91     }
92     
93     public void setInitializer(ArrayInitialization initializer) {
94         objectChanged(CHANGED_INITIALIZER);
95         changeChild(getInitializer(), initializer);
96         this.initializer = initializer;
97     }
98     
99     public List getDimensions() {
100         if (!childrenInited) {
101             initChildren();
102         }
103         return dimensions;
104     }
105     
106     public List getChildren() {
107         List list = new ArrayList(2 + getDimensions().size());
108         addIfNotNull(list, getTypeName());
109         list.addAll(getDimensions());
110         addIfNotNull(list, getInitializer());
111         return list;
112     }
113     
114     protected void initChildren() {
115         childrenInited = false;
116         ASTree tree = getASTree();
117         if (tree != null) {
118             ASTree[] parts = tree.getSubTrees();
119             typeName = (MultipartId) initOrCreate(typeName, parts[0]);
120             dimensions = createChildrenList(dimensions, "dimensions", parts[1], ASTreeTypes.DIM_EXPRS, CHANGED_DIMENSIONS, false); // NOI18N
121
initializer = (ArrayInitialization) initOrCreate(initializer, parts[3]);
122         }
123         childrenInited = true;
124     }
125     
126     public String JavaDoc getSourceText() {
127         String JavaDoc origElem;
128         if ((origElem = checkChange()) != null)
129             return origElem;
130         StringBuffer JavaDoc buf = new StringBuffer JavaDoc();
131         TransientElement initializer = (TransientElement) getInitializer();
132         buf.append("new "); // NOI18N
133
buf.append(((MetadataElement) getTypeName()).getSourceText());
134         appendDimensions(buf);
135         if (initializer != null) {
136             buf.append(initializer.getSourceText());
137         }
138         return buf.toString();
139     }
140
141     private StringBuffer JavaDoc appendDimensions(StringBuffer JavaDoc buf) {
142         List exprs = getDimensions();
143         int totalDim = getDimCount();
144         for (Iterator iter = exprs.iterator(); iter.hasNext();) {
145             TransientElement expr = (TransientElement) iter.next();
146             formatElementPart(ARRAY_OPEN_BRACKET, buf);
147             buf.append(expr.getSourceText());
148             formatElementPart(ARRAY_CLOSE_BRACKET, buf);
149             totalDim--;
150         }
151         for (; totalDim > 0; totalDim--) {
152             formatElementPart(ARRAY_OPEN_BRACKET, buf);
153             formatElementPart(ARRAY_CLOSE_BRACKET, buf);
154         }
155         return buf;
156     }
157
158     public void getDiff(List diff) {
159         ASTProvider parser = getParser();
160         ASTree tree = getASTree();
161         ASTree[] children = tree.getSubTrees();
162
163         getChildDiff(diff, parser, children[0], (MetadataElement) getTypeName(), CHANGED_TYPE);
164         if (isChanged(CHANGED_DIMENSIONS | CHANGED_DIM_COUNT)) {
165             ASTree startTree = children[1] == null ? children[2] : children[1];
166             ASTree endTree = children[2] == null ? children[1] : children[2];
167             diff.add(new DiffElement(getStartOffset(parser, startTree, false), getEndOffset(parser, endTree), appendDimensions(new StringBuffer JavaDoc()).toString()));
168         } else {
169             getCollectionDiff(diff, parser, CHANGED_DIMENSIONS, children[1], ASTreeTypes.DIM_EXPRS, getDimensions(), 0, null);
170         }
171         int index = (children[2] == null ? (children[1] == null ? children[0] : children[1]) : children[2]).getLastToken();
172         int startOffset = parser.getToken(index).getEndOffset();
173         getChildDiff(diff, parser, children[3], (MetadataElement) getInitializer(), CHANGED_INITIAL_VALUE, startOffset, " "); // NOI18N
174
}
175     
176     void setData(List dimensions, ArrayInitialization initializer, MultipartId typeName, int dimCount) {
177         // dimensions
178
this.dimensions = createChildrenList("dimensions", dimensions, CHANGED_DIMENSIONS); // NOI18N
179
// initializer
180
changeChild(null, initializer);
181         this.initializer = initializer;
182         // typeName
183
changeChild(null, typeName);
184         this.typeName = typeName;
185         // dimCount
186
this.dimCount = dimCount;
187     }
188
189     protected void _delete() {
190         // --- delete components -------------------------------------------
191
if (childrenInited) {
192             deleteChildren(dimensions);
193             deleteChild(initializer);
194             deleteChild(typeName);
195         }
196         // --- delete links -----------------------------------------------
197
// no links to delete
198
// --- call super ---------------------------------------
199
super._delete();
200     }
201     
202     public void replaceChild(Element oldElement,Element newElement) {
203         if (childrenInited) {
204             if (replaceObject(getDimensions(),oldElement,newElement))
205                 return;
206             if (oldElement.equals(initializer)) {
207                 setInitializer((ArrayInitialization)newElement);
208             } else if (oldElement.equals(typeName)) {
209                 setTypeName((MultipartId)newElement);
210             }
211         }
212     }
213     
214     public Element duplicate(JavaModelPackage targetExtent) {
215         return targetExtent.getNewArrayExpression().createNewArrayExpression(
216                 (MultipartId) duplicateElement(getTypeName(), targetExtent),
217                 duplicateList(getDimensions(), targetExtent),
218                 getDimCount(),
219                 (ArrayInitialization) duplicateElement(getInitializer(), targetExtent)
220                );
221     }
222 }
223
Popular Tags