/*
* ============================================================================
* GNU General Public License
* ============================================================================
*
* Copyright (C) 2006-2011 Serotonin Software Technologies Inc. http://serotoninsoftware.com
* @author Matthew Lohbihler
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*
* When signing a commercial license with Serotonin Software Technologies Inc.,
* the following extension to GPL is made. A special exception to the GPL is
* included to allow you to distribute a combined work that includes BAcnet4J
* without being obliged to provide the source code for any proprietary components.
*/
package com.serotonin.bacnet4j.util;
import java.io.Serializable;
import java.util.ArrayList;
import java.util.LinkedHashMap;
import java.util.List;
import java.util.Map;
import com.serotonin.bacnet4j.type.constructed.PropertyReference;
import com.serotonin.bacnet4j.type.enumerated.PropertyIdentifier;
import com.serotonin.bacnet4j.type.primitive.ObjectIdentifier;
public class PropertyReferences implements Serializable {
private static final long serialVersionUID = -1512876955215003611L;
private final Map<ObjectIdentifier, List<PropertyReference>> properties = new LinkedHashMap<ObjectIdentifier, List<PropertyReference>>();
public void add(ObjectIdentifier oid, PropertyReference ref) {
List<PropertyReference> refs = properties.get(oid);
if (refs == null) {
refs = new ArrayList<PropertyReference>();
properties.put(oid, refs);
}
refs.add(ref);
}
public void add(ObjectIdentifier oid, PropertyIdentifier pid) {
add(oid, new PropertyReference(pid));
}
public Map<ObjectIdentifier, List<PropertyReference>> getProperties() {
return properties;
}
public List<PropertyReferences> getPropertiesPartitioned(int maxPartitionSize) {
List<PropertyReferences> partitions = new ArrayList<PropertyReferences>();
if (size() <= maxPartitionSize)
partitions.add(this);
else {
PropertyReferences partition = null;
List<PropertyReference> refs;
for (ObjectIdentifier oid : properties.keySet()) {
refs = properties.get(oid);
for (PropertyReference ref : refs) {
if (partition == null || partition.size() >= maxPartitionSize) {
partition = new PropertyReferences();
partitions.add(partition);
}
partition.add(oid, ref);
}
}
}
return partitions;
}
public int size() {
int size = 0;
for (ObjectIdentifier oid : properties.keySet())
size += properties.get(oid).size();
return size;
}
}