001 /** 002 * Licensed to the Apache Software Foundation (ASF) under one or more 003 * contributor license agreements. See the NOTICE file distributed with 004 * this work for additional information regarding copyright ownership. 005 * The ASF licenses this file to You under the Apache License, Version 2.0 006 * (the "License"); you may not use this file except in compliance with 007 * the License. You may obtain a copy of the License at 008 * 009 * http://www.apache.org/licenses/LICENSE-2.0 010 * 011 * Unless required by applicable law or agreed to in writing, software 012 * distributed under the License is distributed on an "AS IS" BASIS, 013 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 014 * See the License for the specific language governing permissions and 015 * limitations under the License. 016 */ 017 package org.fusesource.hawtbuf.proto.compiler; 018 019 import java.util.HashSet; 020 import java.util.List; 021 import java.util.Map; 022 import java.util.Set; 023 024 public class FieldDescriptor { 025 026 public static final String STRING_TYPE = "string".intern(); 027 public static final String BOOL_TYPE = "bool".intern(); 028 public static final String BYTES_TYPE = "bytes".intern(); 029 public static final String DOUBLE_TYPE = "double".intern(); 030 public static final String FLOAT_TYPE = "float".intern(); 031 032 public static final String INT32_TYPE = "int32".intern(); 033 public static final String INT64_TYPE = "int64".intern(); 034 public static final String UINT32_TYPE = "uint32".intern(); 035 public static final String UINT64_TYPE = "uint64".intern(); 036 public static final String SINT32_TYPE = "sint32".intern(); 037 public static final String SINT64_TYPE = "sint64".intern(); 038 public static final String FIXED32_TYPE = "fixed32".intern(); 039 public static final String FIXED64_TYPE = "fixed64".intern(); 040 public static final String SFIXED32_TYPE = "sfixed32".intern(); 041 public static final String SFIXED64_TYPE = "sfixed64".intern(); 042 043 public static final String REQUIRED_RULE = "required".intern(); 044 public static final String OPTIONAL_RULE= "optional".intern(); 045 public static final String REPEATED_RULE = "repeated".intern(); 046 047 public static final Set<String> INT32_TYPES = new HashSet<String>(); 048 public static final Set<String> INT64_TYPES = new HashSet<String>(); 049 public static final Set<String> INTEGER_TYPES = new HashSet<String>(); 050 public static final Set<String> NUMBER_TYPES = new HashSet<String>(); 051 public static final Set<String> SCALAR_TYPES = new HashSet<String>(); 052 053 public static final Set<String> SIGNED_TYPES = new HashSet<String>(); 054 public static final Set<String> UNSIGNED_TYPES = new HashSet<String>(); 055 056 static { 057 INT32_TYPES.add(INT32_TYPE); 058 INT32_TYPES.add(UINT32_TYPE); 059 INT32_TYPES.add(SINT32_TYPE); 060 INT32_TYPES.add(FIXED32_TYPE); 061 INT32_TYPES.add(SFIXED32_TYPE); 062 063 INT64_TYPES.add(INT64_TYPE); 064 INT64_TYPES.add(UINT64_TYPE); 065 INT64_TYPES.add(SINT64_TYPE); 066 INT64_TYPES.add(FIXED64_TYPE); 067 INT64_TYPES.add(SFIXED64_TYPE); 068 069 INTEGER_TYPES.addAll(INT32_TYPES); 070 INTEGER_TYPES.addAll(INT64_TYPES); 071 072 NUMBER_TYPES.addAll(INTEGER_TYPES); 073 NUMBER_TYPES.add(DOUBLE_TYPE); 074 NUMBER_TYPES.add(FLOAT_TYPE); 075 076 SCALAR_TYPES.addAll(NUMBER_TYPES); 077 SCALAR_TYPES.add(STRING_TYPE); 078 SCALAR_TYPES.add(BOOL_TYPE); 079 SCALAR_TYPES.add(BYTES_TYPE); 080 } 081 082 083 private String name; 084 private String type; 085 private String rule; 086 private int tag; 087 private Map<String,OptionDescriptor> options; 088 private TypeDescriptor typeDescriptor; 089 private final MessageDescriptor parent; 090 private MessageDescriptor group; 091 092 public FieldDescriptor(MessageDescriptor parent) { 093 this.parent = parent; 094 } 095 096 public void validate(List<String> errors) { 097 if( group!=null ) { 098 typeDescriptor=group; 099 } 100 if( !SCALAR_TYPES.contains(type) ) { 101 // Find the type def for that guy.. 102 if( typeDescriptor==null ) { 103 typeDescriptor = parent.getType(type); 104 } 105 if( typeDescriptor == null ) { 106 typeDescriptor = parent.getProtoDescriptor().getType(type); 107 } 108 if( typeDescriptor == null ) { 109 errors.add("Field type not found: "+type); 110 } 111 } 112 } 113 114 public boolean isGroup() { 115 return group!=null; 116 } 117 118 public String getName() { 119 return name; 120 } 121 public void setName(String name) { 122 this.name = name; 123 } 124 125 public String getRule() { 126 return rule; 127 } 128 public void setRule(String rule) { 129 this.rule = rule.intern(); 130 } 131 132 public boolean isOptional() { 133 return this.rule == OPTIONAL_RULE; 134 } 135 public boolean isRequired() { 136 return this.rule == REQUIRED_RULE; 137 } 138 public boolean isRepeated() { 139 return this.rule == REPEATED_RULE; 140 } 141 142 public int getTag() { 143 return tag; 144 } 145 public void setTag(int tag) { 146 this.tag = tag; 147 } 148 149 public Map<String,OptionDescriptor> getOptions() { 150 return options; 151 } 152 public void setOptions(Map<String,OptionDescriptor> options) { 153 this.options = options; 154 } 155 156 public String getType() { 157 return type; 158 } 159 public void setType(String type) { 160 this.type = type.intern(); 161 } 162 163 public boolean isMessageType() { 164 return !SCALAR_TYPES.contains(type); 165 } 166 167 public boolean isScalarType() { 168 return SCALAR_TYPES.contains(type); 169 } 170 171 public boolean isNumberType() { 172 return NUMBER_TYPES.contains(type); 173 } 174 175 public boolean isIntegerType() { 176 return INTEGER_TYPES.contains(type); 177 } 178 179 public boolean isInteger32Type() { 180 return INT32_TYPES.contains(type); 181 } 182 183 public boolean isInteger64Type() { 184 return INT64_TYPES.contains(type); 185 } 186 187 public boolean isStringType() { 188 return type==STRING_TYPE; 189 } 190 191 public TypeDescriptor getTypeDescriptor() { 192 return typeDescriptor; 193 } 194 195 public void setTypeDescriptor(TypeDescriptor typeDescriptor) { 196 this.typeDescriptor = typeDescriptor; 197 } 198 199 public MessageDescriptor getGroup() { 200 return group; 201 } 202 public void setGroup(MessageDescriptor group) { 203 this.group = group; 204 } 205 206 }