/* * Copyright 2015 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. * * 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.services.datamodel.backend.server.builder.projects; import java.io.IOException; import java.util.ArrayList; import java.util.Collection; import java.util.HashMap; import java.util.List; 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.kie.workbench.common.services.datamodel.backend.server.builder.util.DataEnumLoader; /** * Builder for DataModelOracle */ public final class ProjectDataModelOracleBuilder { private ProjectDataModelOracleImpl oracle = new ProjectDataModelOracleImpl(); private Map<String, FactBuilder> factTypeBuilders = new HashMap<String, FactBuilder>(); private Map<String, String[]> factFieldEnums = new HashMap<String, String[]>(); private List<String> packageNames = new ArrayList<String>(); private final Map<String, FactBuilder> discoveredFieldFactBuilders = new HashMap<String, FactBuilder>(); private List<String> errors = new ArrayList<String>(); public static ProjectDataModelOracleBuilder newProjectOracleBuilder() { return new ProjectDataModelOracleBuilder(); } private ProjectDataModelOracleBuilder() { } //Used by tests public SimpleFactBuilder addFact( final String factType ) { return addFact( factType, false ); } //Used by tests public SimpleFactBuilder addFact( final String factType, final boolean isEvent ) { return addFact( factType, isEvent, TypeSource.JAVA_PROJECT ); } //Used by tests public SimpleFactBuilder addFact( final String factType, final boolean isEvent, final TypeSource typeSource ) { final SimpleFactBuilder builder = new SimpleFactBuilder( this, factType, isEvent, typeSource ); factTypeBuilders.put( factType, builder ); return builder; } public ProjectDataModelOracleBuilder addClass( final Class clazz) throws IOException { return addClass( clazz, false ); } public ProjectDataModelOracleBuilder addClass( final Class clazz, final boolean isEvent ) throws IOException { return addClass( clazz, isEvent, TypeSource.JAVA_PROJECT ); } public ProjectDataModelOracleBuilder addClass( final Class clazz, final boolean isEvent, final TypeSource typeSource ) throws IOException { final FactBuilder builder = new ClassFactBuilder( this, discoveredFieldFactBuilders, clazz, isEvent, typeSource ); factTypeBuilders.put( clazz.getName(), builder ); return this; } public ProjectDataModelOracleBuilder addEnum( final String factType, final String fieldName, final String[] values ) { final String qualifiedFactField = factType + "#" + fieldName; factFieldEnums.put( qualifiedFactField, values ); return this; } public ProjectDataModelOracleBuilder addEnum( final String enumDefinition, final ClassLoader classLoader ) { parseEnumDefinition( enumDefinition, classLoader ); return this; } private void parseEnumDefinition( final String enumDefinition, final ClassLoader classLoader ) { final DataEnumLoader enumLoader = new DataEnumLoader( enumDefinition, classLoader ); if ( enumLoader.hasErrors() ) { logEnumErrors( enumLoader ); } else { factFieldEnums.putAll( enumLoader.getData() ); } } private void logEnumErrors( final DataEnumLoader enumLoader ) { errors.addAll( enumLoader.getErrors() ); } public ProjectDataModelOracle build() { loadFactTypes(); loadEnums(); loadPackageNames(); return oracle; } private void loadPackageNames() { oracle.addProjectPackageNames( packageNames ); } private void loadFactTypes() { for ( final FactBuilder factBuilder : new ArrayList<FactBuilder>( this.factTypeBuilders.values() ) ) { this.factTypeBuilders.putAll( factBuilder.getInternalBuilders() ); } for ( final FactBuilder factBuilder : this.factTypeBuilders.values() ) { factBuilder.build( oracle ); } } private void loadEnums() { final Map<String, String[]> loadableEnums = new HashMap<String, String[]>(); for ( Map.Entry<String, String[]> e : factFieldEnums.entrySet() ) { final String qualifiedFactField = e.getKey(); loadableEnums.put( qualifiedFactField, e.getValue() ); } oracle.addProjectJavaEnumDefinitions( loadableEnums ); } public void addPackage( String packageName ) { this.packageNames.add( packageName ); } public void addPackages( Collection<String> packageNames ) { this.packageNames.addAll( packageNames ); } }