1 /* 2 * Copyright (c) 1997, 2012, Oracle and/or its affiliates. All rights reserved. 3 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. 4 * 5 * This code is free software; you can redistribute it and/or modify it 6 * under the terms of the GNU General Public License version 2 only, as 7 * published by the Free Software Foundation. Oracle designates this 8 * particular file as subject to the "Classpath" exception as provided 9 * by Oracle in the LICENSE file that accompanied this code. 10 * 11 * This code is distributed in the hope that it will be useful, but WITHOUT 12 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or 13 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License 14 * version 2 for more details (a copy is included in the LICENSE file that 15 * accompanied this code). 16 * 17 * You should have received a copy of the GNU General Public License version 18 * 2 along with this work; if not, write to the Free Software Foundation, 19 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. 20 * 21 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA 22 * or visit www.oracle.com if you need additional information or have any 23 * questions. 24 */ 25 26 package com.sun.tools.internal.xjc.api.impl.s2j; 27 28 import java.util.ArrayList; 29 import java.util.List; 30 31 import javax.xml.bind.JAXBElement; 32 33 import com.sun.codemodel.internal.JBlock; 34 import com.sun.codemodel.internal.JClass; 35 import com.sun.codemodel.internal.JCodeModel; 36 import com.sun.codemodel.internal.JConditional; 37 import com.sun.codemodel.internal.JExpr; 38 import com.sun.codemodel.internal.JExpression; 39 import com.sun.codemodel.internal.JForEach; 40 import com.sun.codemodel.internal.JType; 41 import com.sun.codemodel.internal.JVar; 42 import com.sun.tools.internal.xjc.model.CElementInfo; 43 import static com.sun.tools.internal.xjc.outline.Aspect.EXPOSED; 44 import com.sun.tools.internal.xjc.outline.FieldAccessor; 45 import com.sun.tools.internal.xjc.outline.FieldOutline; 46 47 /** 48 * {@link ElementAdapter} that works with a collection 49 * of {@link JAXBElement}. 50 * 51 * @author Kohsuke Kawaguchi 52 */ 53 final class ElementCollectionAdapter extends ElementAdapter { 54 public ElementCollectionAdapter(FieldOutline core, CElementInfo ei) { 55 super(core, ei); 56 } 57 58 public JType getRawType() { 59 return codeModel().ref(List.class).narrow(itemType().boxify()); 60 } 61 62 private JType itemType() { 63 return ei.getContentInMemoryType().toType(outline(), EXPOSED); 64 } 65 66 public FieldAccessor create(JExpression targetObject) { 67 return new FieldAccessorImpl(targetObject); 68 } 69 70 final class FieldAccessorImpl extends ElementAdapter.FieldAccessorImpl { 71 public FieldAccessorImpl(JExpression target) { 72 super(target); 73 } 74 75 public void toRawValue(JBlock block, JVar $var) { 76 JCodeModel cm = outline().getCodeModel(); 77 JClass elementType = ei.toType(outline(),EXPOSED).boxify(); 78 79 // [RESULT] 80 // $var = new ArrayList(); 81 // for( JAXBElement e : [core.toRawValue] ) { 82 // if(e==null) 83 // $var.add(null); 84 // else 85 // $var.add(e.getValue()); 86 // } 87 88 block.assign($var,JExpr._new(cm.ref(ArrayList.class).narrow(itemType().boxify()))); 89 JVar $col = block.decl(core.getRawType(), "col" + hashCode()); 90 acc.toRawValue(block,$col); 91 JForEach loop = block.forEach(elementType, "v" + hashCode()/*unique string handling*/, $col); 92 93 JConditional cond = loop.body()._if(loop.var().eq(JExpr._null())); 94 cond._then().invoke($var,"add").arg(JExpr._null()); 95 cond._else().invoke($var,"add").arg(loop.var().invoke("getValue")); 96 } 97 98 public void fromRawValue(JBlock block, String uniqueName, JExpression $var) { 99 JCodeModel cm = outline().getCodeModel(); 100 JClass elementType = ei.toType(outline(),EXPOSED).boxify(); 101 102 // [RESULT] 103 // $t = new ArrayList(); 104 // for( Type e : $var ) { 105 // $var.add(new JAXBElement(e)); 106 // } 107 // [core.fromRawValue] 108 109 JClass col = cm.ref(ArrayList.class).narrow(elementType); 110 JVar $t = block.decl(col,uniqueName+"_col",JExpr._new(col)); 111 112 JForEach loop = block.forEach(itemType(), uniqueName+"_i", $t); 113 loop.body().invoke($var,"add").arg(createJAXBElement(loop.var())); 114 115 acc.fromRawValue(block, uniqueName, $t); 116 } 117 } 118 }