/* * Copyright 2016 Red Hat, Inc. and/or its affiliates. * * 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 org.kie.workbench.common.forms.dynamic.backend.server.context.generation.statik.impl; import java.io.IOException; import java.util.HashMap; import java.util.Map; import org.drools.workbench.models.commons.backend.oracle.ProjectDataModelOracleImpl; import org.drools.workbench.models.datamodel.oracle.ProjectDataModelOracle; import org.drools.workbench.models.datamodel.oracle.TypeSource; import org.jboss.errai.common.client.api.Assert; import org.kie.workbench.common.forms.dynamic.service.context.generation.TransformerContext; import org.kie.workbench.common.forms.dynamic.service.shared.impl.StaticModelFormRenderingContext; import org.kie.workbench.common.services.datamodel.backend.server.builder.projects.ClassFactBuilder; import org.kie.workbench.common.services.datamodel.backend.server.builder.projects.FactBuilder; import org.kie.workbench.common.services.datamodel.backend.server.builder.projects.ProjectDataModelOracleBuilder; public class DMOBasedTransformerContext implements TransformerContext<StaticModelFormRenderingContext> { private Object model; private String type; private StaticModelFormRenderingContext renderingContext; private ProjectDataModelOracle oracle; private Map<String, FactBuilder> factBuilders; private DMOBasedTransformerContext(Object model, ProjectDataModelOracle oracle, Map<String, FactBuilder> factBuilders, StaticModelFormRenderingContext context) { this.model = model; this.type = model.getClass().getName(); this.oracle = oracle; this.factBuilders = factBuilders; this.renderingContext = context; } private DMOBasedTransformerContext(Object model, String type, ProjectDataModelOracle oracle, Map<String, FactBuilder> factBuilders, StaticModelFormRenderingContext context) { this.model = model; this.type = type; this.oracle = oracle; this.factBuilders = factBuilders; this.renderingContext = context; } @Override public DMOBasedTransformerContext copyFor(String type) { if (this.getType().equals(type)) { return this; } return new DMOBasedTransformerContext(model, type, oracle, factBuilders, renderingContext); } @Override public Object getModel() { return model; } @Override public String getType() { return type; } @Override public StaticModelFormRenderingContext getRenderingContext() { return renderingContext; } public ProjectDataModelOracle getOracle() { return oracle; } public static DMOBasedTransformerContext getTransformerContextFor(Object model) throws IOException { Assert.notNull("Model cannot be null", model); final ProjectDataModelOracleBuilder builder = ProjectDataModelOracleBuilder.newProjectOracleBuilder(); final ClassFactBuilder modelFactBuilder = new ClassFactBuilder(builder, model.getClass(), false, TypeSource.JAVA_PROJECT); ProjectDataModelOracle oracle = modelFactBuilder.getDataModelBuilder().build(); Map<String, FactBuilder> builders = new HashMap<>(); for (FactBuilder factBuilder : modelFactBuilder.getInternalBuilders().values()) { if (factBuilder instanceof ClassFactBuilder) { builders.put(((ClassFactBuilder) factBuilder).getType(), factBuilder); factBuilder.build((ProjectDataModelOracleImpl) oracle); } } builders.put(modelFactBuilder.getType(), modelFactBuilder); modelFactBuilder.build((ProjectDataModelOracleImpl) oracle); return new DMOBasedTransformerContext(model, oracle, builders, new StaticModelFormRenderingContext()); } }