1 /* 2 * Copyright (c) 1997, 2011, 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.List; 29 30 import com.sun.tools.internal.xjc.api.Property; 31 import com.sun.tools.internal.xjc.api.TypeAndAnnotation; 32 import com.sun.tools.internal.xjc.model.CAdapter; 33 import com.sun.tools.internal.xjc.model.CClassInfo; 34 import com.sun.tools.internal.xjc.model.CElementInfo; 35 import com.sun.tools.internal.xjc.model.CElementPropertyInfo; 36 import com.sun.tools.internal.xjc.model.CTypeInfo; 37 import com.sun.tools.internal.xjc.model.TypeUse; 38 import com.sun.tools.internal.xjc.model.TypeUseFactory; 39 40 /** 41 * @author Kohsuke Kawaguchi 42 */ 43 final class ElementMappingImpl extends AbstractMappingImpl<CElementInfo> { 44 45 private final TypeAndAnnotation taa; 46 47 protected ElementMappingImpl(JAXBModelImpl parent, CElementInfo elementInfo) { 48 super(parent,elementInfo); 49 50 TypeUse t = clazz.getContentType(); 51 if(clazz.getProperty().isCollection()) 52 t = TypeUseFactory.makeCollection(t); 53 CAdapter a = clazz.getProperty().getAdapter(); 54 if(a!=null) 55 t = TypeUseFactory.adapt(t,a); 56 taa = new TypeAndAnnotationImpl(parent.outline,t); 57 } 58 59 public TypeAndAnnotation getType() { 60 return taa; 61 } 62 63 public final List<Property> calcDrilldown() { 64 CElementPropertyInfo p = clazz.getProperty(); 65 66 if(p.getAdapter()!=null) 67 return null; // if adapted, avoid drill down 68 69 if(p.isCollection()) 70 // things like <xs:element name="foo" type="xs:NMTOKENS" /> is not eligible. 71 return null; 72 73 CTypeInfo typeClass = p.ref().get(0); 74 75 if(!(typeClass instanceof CClassInfo)) 76 // things like <xs:element name="foo" type="xs:string" /> is not eligible. 77 return null; 78 79 CClassInfo ci = (CClassInfo)typeClass; 80 81 // if the type is abstract we can't use it. 82 if(ci.isAbstract()) 83 return null; 84 85 // the 'all' compositor doesn't qualify 86 if(!ci.isOrdered()) 87 return null; 88 89 return buildDrilldown(ci); 90 } 91 }