blob: 3471c413b968cd0f076deb0be447cbfe40e10132 [file] [log] [blame]
/**
* Licensed to the Apache Software Foundation (ASF) under one or more
* contributor license agreements. See the NOTICE file distributed with
* this work for additional information regarding copyright ownership.
* The ASF licenses this file to You under the Apache License, Version 2.0
* (the "License"); you may not use this file except in compliance with
* the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.apache.activemq.protobuf.compiler;
import java.util.ArrayList;
import java.util.HashSet;
import java.util.List;
import java.util.Map;
import java.util.Set;
public class FieldDescriptor {
public static final String STRING_TYPE = "string".intern();
public static final String BOOL_TYPE = "bool".intern();
public static final String BYTES_TYPE = "bytes".intern();
public static final String DOUBLE_TYPE = "double".intern();
public static final String FLOAT_TYPE = "float".intern();
public static final String INT32_TYPE = "int32".intern();
public static final String INT64_TYPE = "int64".intern();
public static final String UINT32_TYPE = "uint32".intern();
public static final String UINT64_TYPE = "uint64".intern();
public static final String SINT32_TYPE = "sint32".intern();
public static final String SINT64_TYPE = "sint64".intern();
public static final String FIXED32_TYPE = "fixed32".intern();
public static final String FIXED64_TYPE = "fixed64".intern();
public static final String SFIXED32_TYPE = "sfixed32".intern();
public static final String SFIXED64_TYPE = "sfixed64".intern();
public static final String REQUIRED_RULE = "required".intern();
public static final String OPTIONAL_RULE= "optional".intern();
public static final String REPEATED_RULE = "repeated".intern();
public static final Set<String> INT32_TYPES = new HashSet<String>();
public static final Set<String> INT64_TYPES = new HashSet<String>();
public static final Set<String> INTEGER_TYPES = new HashSet<String>();
public static final Set<String> NUMBER_TYPES = new HashSet<String>();
public static final Set<String> SCALAR_TYPES = new HashSet<String>();
public static final Set<String> SIGNED_TYPES = new HashSet<String>();
public static final Set<String> UNSIGNED_TYPES = new HashSet<String>();
static {
INT32_TYPES.add(INT32_TYPE);
INT32_TYPES.add(UINT32_TYPE);
INT32_TYPES.add(SINT32_TYPE);
INT32_TYPES.add(FIXED32_TYPE);
INT32_TYPES.add(SFIXED32_TYPE);
INT64_TYPES.add(INT64_TYPE);
INT64_TYPES.add(UINT64_TYPE);
INT64_TYPES.add(SINT64_TYPE);
INT64_TYPES.add(FIXED64_TYPE);
INT64_TYPES.add(SFIXED64_TYPE);
INTEGER_TYPES.addAll(INT32_TYPES);
INTEGER_TYPES.addAll(INT64_TYPES);
NUMBER_TYPES.addAll(INTEGER_TYPES);
NUMBER_TYPES.add(DOUBLE_TYPE);
NUMBER_TYPES.add(FLOAT_TYPE);
SCALAR_TYPES.addAll(NUMBER_TYPES);
SCALAR_TYPES.add(STRING_TYPE);
SCALAR_TYPES.add(BOOL_TYPE);
SCALAR_TYPES.add(BYTES_TYPE);
}
private String name;
private String type;
private String rule;
private int tag;
private Map<String,OptionDescriptor> options;
private TypeDescriptor typeDescriptor;
private final MessageDescriptor parent;
private MessageDescriptor group;
public FieldDescriptor(MessageDescriptor parent) {
this.parent = parent;
}
public void validate(List<String> errors) {
if( group!=null ) {
typeDescriptor=group;
}
if( !SCALAR_TYPES.contains(type) ) {
// Find the type def for that guy..
if( typeDescriptor==null ) {
typeDescriptor = parent.getType(type);
}
if( typeDescriptor == null ) {
typeDescriptor = parent.getProtoDescriptor().getType(type);
}
if( typeDescriptor == null ) {
errors.add("Field type not found: "+type);
}
}
}
public boolean isGroup() {
return group!=null;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getRule() {
return rule;
}
public void setRule(String rule) {
this.rule = rule.intern();
}
public boolean isOptional() {
return this.rule == OPTIONAL_RULE;
}
public boolean isRequired() {
return this.rule == REQUIRED_RULE;
}
public boolean isRepeated() {
return this.rule == REPEATED_RULE;
}
public int getTag() {
return tag;
}
public void setTag(int tag) {
this.tag = tag;
}
public Map<String,OptionDescriptor> getOptions() {
return options;
}
public void setOptions(Map<String,OptionDescriptor> options) {
this.options = options;
}
public String getType() {
return type;
}
public void setType(String type) {
this.type = type.intern();
}
public boolean isMessageType() {
return !SCALAR_TYPES.contains(type);
}
public boolean isScalarType() {
return SCALAR_TYPES.contains(type);
}
public boolean isNumberType() {
return NUMBER_TYPES.contains(type);
}
public boolean isIntegerType() {
return INTEGER_TYPES.contains(type);
}
public boolean isInteger32Type() {
return INT32_TYPES.contains(type);
}
public boolean isInteger64Type() {
return INT64_TYPES.contains(type);
}
public boolean isStringType() {
return type==STRING_TYPE;
}
public TypeDescriptor getTypeDescriptor() {
return typeDescriptor;
}
public void setTypeDescriptor(TypeDescriptor typeDescriptor) {
this.typeDescriptor = typeDescriptor;
}
public MessageDescriptor getGroup() {
return group;
}
public void setGroup(MessageDescriptor group) {
this.group = group;
}
}