net.sf.ipsedixit.core.impl.StringFieldHandler.java Source code

Java tutorial

Introduction

Here is the source code for net.sf.ipsedixit.core.impl.StringFieldHandler.java

Source

/*
 *  Copyright 2008 the original author or authors.
 *
 *  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 net.sf.ipsedixit.core.impl;

import net.sf.ipsedixit.core.DataProvider;
import net.sf.ipsedixit.core.MutableField;
import net.sf.ipsedixit.core.MetaDataCreator;
import net.sf.ipsedixit.core.StringMetaData;
import net.sf.ipsedixit.core.FieldHandler;
import net.sf.ipsedixit.core.StringType;
import org.apache.commons.lang.StringUtils;

/**
 * Handler for String fields.
 */
public class StringFieldHandler implements FieldHandler {

    private final MetaDataCreator<StringMetaData> metaDataProvider;
    private final DataProvider dataProvider;

    /**
     * Creates a StringFieldHandler.
     *
     * @param metaDataCreator to get any metadata on the field, such as maximum length.
     * @param dataProvider to generate the random value.
     */
    public StringFieldHandler(MetaDataCreator<StringMetaData> metaDataCreator, DataProvider dataProvider) {
        this.metaDataProvider = metaDataCreator;
        this.dataProvider = dataProvider;
    }

    /**
     * @param mutableField a MutableField.
     * @return true, if and only if the MutableField represents a String.
     */
    public boolean supports(MutableField mutableField) {
        Class type = mutableField.getType();
        return String.class.equals(type);
    }

    /**
     * @param mutableField the {@link net.sf.ipsedixit.core.MutableField} containing a String field.
     * @return a random String value, constrained by any metadata that is present on the field.
     */
    public String getValueFor(MutableField mutableField) {
        StringBuilder stringBuilder = new StringBuilder();
        StringMetaData stringMetaData = metaDataProvider.getMetaData(mutableField);

        int totalLength = stringMetaData.length();
        StringType stringType = stringMetaData.type();

        appendFieldNameIfRequired(stringBuilder, mutableField, stringType, totalLength);
        appendContainedStringIfRequired(stringBuilder, stringType, stringMetaData);
        stringBuilder.append(dataProvider.randomString(stringType, totalLength));

        return StringUtils.left(stringBuilder.toString(), totalLength);
    }

    private void appendContainedStringIfRequired(StringBuilder stringBuilder, StringType stringType,
            StringMetaData stringMetaData) {
        String containedString = stringMetaData.contains();
        if (StringUtils.isNotEmpty(containedString)) {
            stringBuilder.append(containedString).append(getSeparatorChar(stringType));
        }
    }

    private void appendFieldNameIfRequired(StringBuilder stringBuilder, MutableField mutableField,
            StringType stringType, int totalLength) {
        String prefix = mutableField.getName();
        if (prefix.length() < totalLength && stringType != StringType.NUMERIC) {
            stringBuilder.append(prefix).append(getSeparatorChar(stringType));
        }
    }

    private String getSeparatorChar(StringType stringType) {
        return stringType == StringType.ANY ? "_" : "";
    }

}