blob: 59a6d9e28a930939e80549b31035e51b548cbc42 [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.qpid.gentools;
import java.util.Map.Entry;
import java.util.Collection;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
import java.util.List;
import java.util.Map;
import java.util.HashMap;
public class SingleVersionMethod
{
private final AmqpMethod _amqpMethod;
private final AmqpVersion _amqpVersion;
private final int _methodId;
private final List<SingleVersionField> _fieldList = new ArrayList<SingleVersionField>();
private final Generator _generator;
private final List<ConsolidatedField> _consolidatedFields = new ArrayList<ConsolidatedField>();
private final Map<String, ConsolidatedField> _fieldNameToConsolidatedFieldMap = new HashMap<String, ConsolidatedField>();
public SingleVersionMethod(AmqpMethod amqpMethod, AmqpVersion amqpVersion, Generator generator)
{
_amqpMethod = amqpMethod;
_amqpVersion = amqpVersion;
_generator = generator;
AmqpOrdinalVersionMap indexMap = amqpMethod.getIndexMap();
int methodId = 0;
for(Entry<Integer, AmqpVersionSet> entry : indexMap.entrySet())
{
if(entry.getValue().contains(_amqpVersion))
{
methodId = entry.getKey();
break;
}
}
_methodId = methodId;
Collection<AmqpField> fields = _amqpMethod.getFieldMap().values();
for(AmqpField field : fields)
{
_fieldList.add(new SingleVersionField(field, _amqpVersion, _generator));
}
Collections.sort(_fieldList, new Comparator<SingleVersionField>(){
public int compare(SingleVersionField field1, SingleVersionField field2)
{
return field1.getPosition() - field2.getPosition();
}
});
ConsolidatedField lastField = null;
int bitfieldNum = 0;
for(SingleVersionField field : _fieldList)
{
String domainType = field.getDomainType();
if(!domainType.equals("bit"))
{
lastField = new ConsolidatedField(_generator,
field.getName(),
field.getDomainType());
_consolidatedFields.add(lastField);
}
else if(lastField == null || !lastField.getType().equals("bitfield"))
{
lastField = new ConsolidatedField(_generator,
domainType.equals("bit") ? "bitfield"+bitfieldNum++ : field.getName(),
domainType.equals("bit") ? "bitfield" : field.getDomainType(),
field.getName());
_consolidatedFields.add(lastField);
}
else
{
lastField.add(field.getName());
}
_fieldNameToConsolidatedFieldMap.put(field.getName(), lastField);
}
}
public int getMethodId()
{
return _methodId;
}
public String getName()
{
return _amqpMethod.getName();
}
public Collection<SingleVersionField> getFieldList()
{
return Collections.unmodifiableCollection(_fieldList);
}
public List<ConsolidatedField> getConsolidatedFields()
{
return _consolidatedFields;
}
public String getConsolidatedFieldName(String fieldName)
{
return _fieldNameToConsolidatedFieldMap.get(fieldName).getName();
}
public boolean isConsolidated(String fieldName)
{
return _fieldNameToConsolidatedFieldMap.get(fieldName).isConsolidated();
}
public int getPositionInBitField(String fieldName)
{
return _fieldNameToConsolidatedFieldMap.get(fieldName).getPosition(fieldName);
}
public boolean isServerMethod()
{
return _amqpMethod.isServerMethod(_amqpVersion);
}
public boolean isClientMethod()
{
return _amqpMethod.isClientMethod(_amqpVersion);
}
}