/*
* 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.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.DataType;
import org.drools.workbench.models.datamodel.oracle.FieldAccessorsAndMutators;
import org.drools.workbench.models.datamodel.oracle.ModelField;
import org.drools.workbench.models.datamodel.oracle.TypeSource;
/**
* Base FactBuilder containing common code
*/
public abstract class BaseFactBuilder implements FactBuilder {
protected final ProjectDataModelOracleBuilder builder;
private final String type;
private final List<ModelField> fields = new ArrayList<ModelField>();
private final boolean isCollection;
private final boolean isEvent;
protected final TypeSource typeSource;
public BaseFactBuilder( final ProjectDataModelOracleBuilder builder,
final Class<?> clazz,
final boolean isEvent,
final TypeSource typeSource ) {
this.builder = builder;
this.type = getFullClassName( clazz );
this.isCollection = isCollection( clazz );
this.isEvent = isEvent;
this.typeSource = typeSource;
addField( new ModelField( DataType.TYPE_THIS,
type,
ModelField.FIELD_CLASS_TYPE.REGULAR_CLASS,
ModelField.FIELD_ORIGIN.SELF,
FieldAccessorsAndMutators.ACCESSOR,
DataType.TYPE_THIS ) );
}
public BaseFactBuilder( final ProjectDataModelOracleBuilder builder,
final String type,
final boolean isCollection,
final boolean isEvent,
final TypeSource typeSource ) {
this.builder = builder;
this.type = type;
this.isCollection = isCollection;
this.isEvent = isEvent;
this.typeSource = typeSource;
addField( new ModelField( DataType.TYPE_THIS,
type,
ModelField.FIELD_CLASS_TYPE.REGULAR_CLASS,
ModelField.FIELD_ORIGIN.SELF,
FieldAccessorsAndMutators.ACCESSOR,
DataType.TYPE_THIS ) );
}
private boolean isCollection( final Class<?> clazz ) {
return ( clazz != null && Collection.class.isAssignableFrom( clazz ) );
}
private String getFullClassName( final Class<?> clazz ) {
return clazz.getName();
}
public String getType() {
return type;
}
protected FactBuilder addField( final ModelField field ) {
this.fields.add( field );
return this;
}
@Override
public ProjectDataModelOracleBuilder end() {
return builder;
}
@Override
public void build( final ProjectDataModelOracleImpl oracle ) {
oracle.addProjectModelFields( buildModelFields() );
oracle.addProjectCollectionTypes( buildCollectionTypes() );
oracle.addProjectEventTypes( buildEventTypes() );
oracle.addProjectTypeSources( buildTypeSources() );
}
public ProjectDataModelOracleBuilder getDataModelBuilder() {
return this.builder;
}
private Map<String, ModelField[]> buildModelFields() {
final Map<String, ModelField[]> loadableFactsAndFields = new HashMap<String, ModelField[]>();
final ModelField[] loadableFields = new ModelField[ fields.size() ];
fields.toArray( loadableFields );
loadableFactsAndFields.put( type,
loadableFields );
return loadableFactsAndFields;
}
private Map<String, Boolean> buildCollectionTypes() {
final Map<String, Boolean> loadableCollectionTypes = new HashMap<String, Boolean>();
loadableCollectionTypes.put( type,
isCollection );
return loadableCollectionTypes;
}
private Map<String, Boolean> buildEventTypes() {
final Map<String, Boolean> loadableEventTypes = new HashMap<String, Boolean>();
loadableEventTypes.put( type,
isEvent );
return loadableEventTypes;
}
private Map<String, TypeSource> buildTypeSources() {
final Map<String, TypeSource> loadableTypeSources = new HashMap<String, TypeSource>();
loadableTypeSources.put( type,
typeSource );
return loadableTypeSources;
}
}