/*
* Copyright 2011 Edmunds.com, Inc.
*
* Licensed 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 com.edmunds.etm.common.api;
import com.edmunds.etm.common.thrift.UrlTokenDto;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import org.apache.commons.lang.Validate;
import org.apache.log4j.Logger;
/**
* @author Ryan Holmes
*/
public abstract class UrlToken {
private static final Logger logger = Logger.getLogger(UrlToken.class);
private String name;
private List<String> values;
public UrlToken(String name, List<String> values) {
Validate.notEmpty(name, "UrlToken name is empty");
this.name = name;
this.values = values == null ? new ArrayList<String>() : values;
}
/**
* Returns the unique name of this token.
*
* @return the token name
*/
public String getName() {
return name;
}
/**
* Gets the list of values represented by this token.
*
* @return list of string values
*/
public List<String> getValues() {
return Collections.unmodifiableList(values);
}
/**
* Sets the values represented by this token.
*
* @param values list of string values
*/
public void setValues(List<String> values) {
this.values = values == null ? new ArrayList<String>() : values;
}
/**
* Adds a new value to this URL token.
*
* @param value the value to add
*/
public void addValue(String value) {
this.values.add(value);
}
/**
* Returns the regular expression that corresponds to this token.
*
* @return
*/
public abstract String toRegex();
/**
* Gets the type of this token as an enum.
*
* @return the token type
*/
public abstract UrlTokenType getType();
/**
* Factory method to create a new UrlToken of the specified type.
*
* @param type type of token to create
* @param name token name
* @param values list of values
* @return new UrlToken object
*/
public static UrlToken newUrlToken(UrlTokenType type, String name, List<String> values) {
UrlToken token;
switch(type) {
case FIXED:
token = new FixedUrlToken(name, values);
break;
case REGEX:
token = new RegexUrlToken(name, values.get(0));
break;
default:
throw new IllegalStateException(String.format("Unrecognized UrlTokenType: %s", type));
}
return token;
}
/**
* Reads the specified DTO and returns a UrlToken object.
*
* @param dto the DTO to read
* @return a UrlToken object
*/
public static UrlToken readDto(UrlTokenDto dto) {
if(dto == null) {
return null;
}
UrlTokenType type;
try {
type = UrlTokenType.valueOf(dto.getType());
} catch(RuntimeException ex) {
logger.warn(String.format("Invalid URL token type read from DTO: %s; defaulting to FIXED", dto.getType()));
type = UrlTokenType.FIXED;
}
return newUrlToken(type, dto.getName(), dto.getValues());
}
/**
* Writes the specified UrlToken object as a DTO.
*
* @param obj a UrlToken object
* @return a DTO
*/
public static UrlTokenDto writeDto(UrlToken obj) {
if(obj == null) {
return null;
}
UrlTokenDto dto = new UrlTokenDto();
dto.setName(obj.getName());
dto.setType(obj.getType().name());
dto.setValues(obj.getValues());
return dto;
}
}