/******************************************************************************* * See the NOTICE file distributed with this work for additional information * regarding copyright ownership. * * 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 hr.fer.zemris.vhdllab.applets.editor.schema2.model.parameters; import hr.fer.zemris.vhdllab.applets.editor.schema2.constants.Constants; import hr.fer.zemris.vhdllab.applets.editor.schema2.enums.EParamTypes; import hr.fer.zemris.vhdllab.applets.editor.schema2.exceptions.NotImplementedException; import hr.fer.zemris.vhdllab.applets.editor.schema2.interfaces.IGenericValue; import hr.fer.zemris.vhdllab.applets.editor.schema2.interfaces.IParameter; import hr.fer.zemris.vhdllab.applets.editor.schema2.misc.Caseless; import hr.fer.zemris.vhdllab.applets.editor.schema2.misc.Time; import hr.fer.zemris.vhdllab.applets.editor.schema2.predefined.beans.ParameterWrapper; import java.lang.reflect.Constructor; import java.util.HashSet; import java.util.Set; public class ParameterFactory { /* static fields */ public static final String PAR_INTEGER = EParamTypes.INTEGER.toString(); public static final String PAR_BOOLEAN = EParamTypes.BOOLEAN.toString(); public static final String PAR_DECIMAL = EParamTypes.DECIMAL.toString(); public static final String PAR_TEXT = EParamTypes.TEXT.toString(); public static final String PAR_TIME = EParamTypes.TIME.toString(); public static final String PAR_CASELESS = EParamTypes.CASELESS.toString(); public static final String PAR_OBJECT = EParamTypes.OBJECT.toString(); /* private fields */ /* ctors */ /* methods */ public static IParameter createParameter(ParameterWrapper parwrapper) { IParameter parameter; String partype = parwrapper.getParamType(); if (partype.equals(ParameterFactory.PAR_BOOLEAN)) parameter = createBoolean(parwrapper); else if (partype.equals(ParameterFactory.PAR_INTEGER)) parameter = createInteger(parwrapper); else if (partype.equals(ParameterFactory.PAR_DECIMAL)) parameter = createDecimal(parwrapper); else if (partype.equals(ParameterFactory.PAR_TEXT)) parameter = createText(parwrapper); else if (partype.equals(ParameterFactory.PAR_TIME)) parameter = createTime(parwrapper); else if (partype.equals(ParameterFactory.PAR_CASELESS)) parameter = createCaseless(parwrapper); else if (partype.equals(ParameterFactory.PAR_OBJECT)) parameter = createObject(parwrapper); else throw new NotImplementedException("Parameter type '" + partype + "' not implemented."); return parameter; } @SuppressWarnings("unchecked") private static IGenericValue createGenericValue(ParameterWrapper parwrapper) { String valclass = parwrapper.getValueType(); Object valobj = null; IGenericValue genval = null; try { Class cls = Class.forName(valclass); Constructor<IGenericValue> ctor = cls.getConstructor((Class[])null); valobj = ctor.newInstance((Object[])null); genval = (IGenericValue)valobj; } catch (Exception e) { throw new IllegalArgumentException("Cannot instantiate parameter " + "value - is value IGenericValue?", e); } return genval; } @SuppressWarnings("unchecked") private static IParameter createObject(ParameterWrapper parwrapper) { IParameter parameter = new GenericParameter(parwrapper.getName(), parwrapper.getGeneric(), null); // instantiate value object IGenericValue genval = createGenericValue(parwrapper); // deserialize IGenericValue object genval.deserialize(parwrapper.getValue()); // now set value parameter.setValue(genval); // set constraint's allowedValuesSet if (parwrapper.getAllowedValues() != null && !parwrapper.getAllowedValues().equals("")) { Set<Object> allowed = new HashSet<Object>(); String[] sfield = parwrapper.getAllowedValues().split(Constants.ALLOWED_SET_DIVIDER); for (int i = 0; i < sfield.length; i++) { genval = createGenericValue(parwrapper); genval.deserialize(sfield[i]); allowed.add(genval); } parameter.getConstraint().setPossibleValues(allowed); } String eventName = parwrapper.getEventName(); if (eventName != null && !eventName.trim().equals("")) parameter.setParameterEvent(eventName); return parameter; } private static IParameter createCaseless(ParameterWrapper parwrapper) { IParameter parameter = new CaselessParameter(parwrapper.getName(), parwrapper.getGeneric()); Caseless val = new Caseless(parwrapper.getValue()); parameter.setValue(val); if (parwrapper.getAllowedValues() != null && !parwrapper.getAllowedValues().equals("")) { Set<Object> allowed = new HashSet<Object>(); String[] sfield = parwrapper.getAllowedValues().split(Constants.ALLOWED_SET_DIVIDER); for (int i = 0; i < sfield.length; i++) { allowed.add(new Caseless(sfield[i])); } parameter.getConstraint().setPossibleValues(allowed); } String eventName = parwrapper.getEventName(); if (eventName != null && !eventName.trim().equals("")) parameter.setParameterEvent(eventName); return parameter; } private static IParameter createTime(ParameterWrapper parwrapper) { IParameter parameter = new TimeParameter(parwrapper.getName(), parwrapper.getGeneric()); String val = parwrapper.getValue(); parameter.setAsString(val); if (parwrapper.getAllowedValues() != null && !parwrapper.getAllowedValues().equals("")) { Set<Object> allowed = new HashSet<Object>(); String[] sfield = parwrapper.getAllowedValues().split(Constants.ALLOWED_SET_DIVIDER); for (int i = 0; i < sfield.length; i++) { allowed.add(Time.parseTime(sfield[i])); } parameter.getConstraint().setPossibleValues(allowed); } String eventName = parwrapper.getEventName(); if (eventName != null && !eventName.trim().equals("")) parameter.setParameterEvent(eventName); return parameter; } private static IParameter createText(ParameterWrapper parwrapper) { IParameter parameter = new TextParameter(parwrapper.getName(), parwrapper.getGeneric()); String val = parwrapper.getValue(); parameter.setValue(val); if (parwrapper.getAllowedValues() != null && !parwrapper.getAllowedValues().equals("")) { Set<Object> allowed = new HashSet<Object>(); String[] sfield = parwrapper.getAllowedValues().split(Constants.ALLOWED_SET_DIVIDER); for (int i = 0; i < sfield.length; i++) { allowed.add(sfield[i]); } parameter.getConstraint().setPossibleValues(allowed); } String eventName = parwrapper.getEventName(); if (eventName != null && !eventName.trim().equals("")) parameter.setParameterEvent(eventName); return parameter; } private static IParameter createDecimal(ParameterWrapper parwrapper) { IParameter parameter = new DecimalParameter(parwrapper.getGeneric(), parwrapper.getName()); Double val = new Double(Double.parseDouble(parwrapper.getValue())); parameter.setValue(val); if (parwrapper.getAllowedValues() != null && !parwrapper.getAllowedValues().equals("")) { Set<Object> allowed = new HashSet<Object>(); String[] sfield = parwrapper.getAllowedValues().split(Constants.ALLOWED_SET_DIVIDER); for (int i = 0; i < sfield.length; i++) { try { allowed.add(new Double(Double.parseDouble(sfield[i]))); } catch (NumberFormatException nfe) { continue; } } parameter.getConstraint().setPossibleValues(allowed); } String eventName = parwrapper.getEventName(); if (eventName != null && !eventName.trim().equals("")) parameter.setParameterEvent(eventName); return parameter; } private static IParameter createInteger(ParameterWrapper parwrapper) { IParameter parameter = new IntegerParameter(parwrapper.getGeneric(), parwrapper.getName()); Integer val = new Integer(Integer.parseInt(parwrapper.getValue())); parameter.setValue(val); if (parwrapper.getAllowedValues() != null && !parwrapper.getAllowedValues().equals("")) { Set<Object> allowed = new HashSet<Object>(); String[] sfield = parwrapper.getAllowedValues().split(Constants.ALLOWED_SET_DIVIDER); for (int i = 0; i < sfield.length; i++) { try { allowed.add(Integer.valueOf(Integer.parseInt(sfield[i]))); } catch (NumberFormatException nfe) { continue; } } parameter.getConstraint().setPossibleValues(allowed); } String eventName = parwrapper.getEventName(); if (eventName != null && !eventName.trim().equals("")) parameter.setParameterEvent(eventName); return parameter; } private static IParameter createBoolean(ParameterWrapper parwrapper) { IParameter parameter = new BooleanParameter(parwrapper.getGeneric(), parwrapper.getName()); Boolean val = new Boolean(Boolean.parseBoolean(parwrapper.getValue())); parameter.setValue(val); if (parwrapper.getAllowedValues() != null && !parwrapper.getAllowedValues().equals("")) { Set<Object> allowed = new HashSet<Object>(); String[] sfield = parwrapper.getAllowedValues().split(Constants.ALLOWED_SET_DIVIDER); for (int i = 0; i < sfield.length; i++) { allowed.add(Boolean.valueOf(Boolean.parseBoolean(sfield[i]))); } parameter.getConstraint().setPossibleValues(allowed); } String eventName = parwrapper.getEventName(); if (eventName != null && !eventName.trim().equals("")) parameter.setParameterEvent(eventName); return parameter; } }