/* * Copyright 2003-2015 JetBrains s.r.o. * * 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 jetbrains.mps.idea.testFramework; import org.jetbrains.annotations.NotNull; import java.io.File; import java.io.FileNotFoundException; import java.lang.reflect.Field; import java.util.List; public class MpsBeanAdjuster<B extends MpsBean> { private final B myBean; public MpsBeanAdjuster(@NotNull B emptyBean) { myBean = emptyBean; } @NotNull public B constructBeanFromFile(@NotNull File file) throws FileNotFoundException, ParseException { List<Field> fields = new BeanCompatibilityChecker(myBean.getClass()).checkAndReturnFields(); fillFieldsFromFile(file, fields, myBean); return myBean; } private void fillFieldsFromFile(File file, List<Field> filteredFields, MpsBean bean) throws FileNotFoundException, ParseException { MpsTestDataParser dataParser = new MpsTestDataParser(file); try { for (Field field : filteredFields) { Class<? extends Entry> entryClass = Entry.getEntryfromClass(field.getType()); Entry entry = dataParser.nextToken(entryClass); checkFieldNameMatchesEntry(field, entry); setFieldFromEntry(bean, field, entry); } } finally { dataParser.close(); } } private void setFieldFromEntry(MpsBean bean, Field field, Entry entry) { try { field.set(bean, entry.myValue); } catch (IllegalAccessException e) { throw new RuntimeException("Could not set field " + field.getName() + " from the entry " + entry, e); } } private void checkFieldNameMatchesEntry(Field field, Entry entry) throws ParseException { if (!entry.myName.equals(field.getName())) { throw new ParseException("The name of the field '" + field.getName() + "' does not match the property string in the file '" + entry.myName + "'."); } } public static class IllegalBeanFormatException extends IllegalArgumentException { public IllegalBeanFormatException(String msg) { super(msg); } } }