/*
* Copyright 2010-2011 Ning, Inc.
*
* Ning 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.killbill.billing.util.tag;
import java.util.List;
import java.util.UUID;
import org.killbill.billing.ObjectType;
import org.killbill.billing.entity.EntityBase;
import org.killbill.billing.util.UUIDs;
import org.killbill.billing.util.tag.dao.TagDefinitionModelDao;
import com.fasterxml.jackson.annotation.JsonCreator;
import com.fasterxml.jackson.annotation.JsonProperty;
import com.google.common.collect.ImmutableList;
public class DefaultTagDefinition extends EntityBase implements TagDefinition {
private final String name;
private final String description;
private final Boolean controlTag;
private final List<ObjectType> applicableObjectTypes;
public DefaultTagDefinition(final TagDefinitionModelDao tagDefinitionModelDao, final boolean isControlTag) {
this(tagDefinitionModelDao.getId(), tagDefinitionModelDao.getName(), tagDefinitionModelDao.getDescription(), isControlTag);
}
public DefaultTagDefinition(final String name, final String description, final Boolean isControlTag) {
this(UUIDs.randomUUID(), name, description, isControlTag);
}
public DefaultTagDefinition(final UUID id, final String name, final String description, final Boolean isControlTag) {
this(id, name, description, isControlTag, getApplicableObjectTypes(id, isControlTag));
}
public DefaultTagDefinition(final ControlTagType controlTag) {
this(controlTag.getId(), controlTag.toString(), controlTag.getDescription(), true, controlTag.getApplicableObjectTypes());
}
@JsonCreator
public DefaultTagDefinition(@JsonProperty("id") final UUID id,
@JsonProperty("name") final String name,
@JsonProperty("description") final String description,
@JsonProperty("controlTag") final Boolean controlTag,
@JsonProperty("applicableObjectTypes") final List<ObjectType> applicableObjectTypes) {
super(id);
this.name = name;
this.description = description;
this.controlTag = controlTag;
this.applicableObjectTypes = applicableObjectTypes;
}
@Override
public String getName() {
return name;
}
@Override
public String getDescription() {
return description;
}
@Override
public Boolean isControlTag() {
return controlTag;
}
@Override
public List<ObjectType> getApplicableObjectTypes() {
return applicableObjectTypes;
}
@Override
public String toString() {
final StringBuilder sb = new StringBuilder();
sb.append("DefaultTagDefinition");
sb.append("{name='").append(name).append('\'');
sb.append(", description='").append(description).append('\'');
sb.append(", controlTag=").append(controlTag);
sb.append(", applicableObjectTypes=").append(applicableObjectTypes);
sb.append('}');
return sb.toString();
}
@Override
public boolean equals(final Object o) {
if (this == o) {
return true;
}
if (o == null || getClass() != o.getClass()) {
return false;
}
final DefaultTagDefinition that = (DefaultTagDefinition) o;
if (applicableObjectTypes != null ? !applicableObjectTypes.equals(that.applicableObjectTypes) : that.applicableObjectTypes != null) {
return false;
}
if (controlTag != null ? !controlTag.equals(that.controlTag) : that.controlTag != null) {
return false;
}
if (description != null ? !description.equals(that.description) : that.description != null) {
return false;
}
if (name != null ? !name.equals(that.name) : that.name != null) {
return false;
}
return true;
}
@Override
public int hashCode() {
int result = name != null ? name.hashCode() : 0;
result = 31 * result + (description != null ? description.hashCode() : 0);
result = 31 * result + (controlTag != null ? controlTag.hashCode() : 0);
result = 31 * result + (applicableObjectTypes != null ? applicableObjectTypes.hashCode() : 0);
return result;
}
private static List<ObjectType> getApplicableObjectTypes(final UUID id, final Boolean isControlTag) {
if (!isControlTag) {
return ImmutableList.<ObjectType>copyOf(ObjectType.values());
}
for (final ControlTagType cur : ControlTagType.values()) {
if (cur.getId().equals(id)) {
return cur.getApplicableObjectTypes();
}
}
throw new IllegalStateException(String.format("ControlTag id %s does not seem to exist", id));
}
}