/*
* 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.server.services.jbpm.ui.form;
import java.util.Collection;
import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;
import java.util.stream.Collectors;
import com.google.gson.Gson;
import com.google.gson.JsonArray;
import com.google.gson.JsonObject;
import com.google.gson.JsonParser;
import org.apache.commons.lang3.StringUtils;
import org.jbpm.kie.services.impl.FormManagerService;
import org.jbpm.kie.services.impl.form.provider.AbstractFormProvider;
import org.jbpm.kie.services.impl.model.ProcessAssetDesc;
import org.jbpm.services.api.model.ProcessDefinition;
import org.kie.api.task.model.Task;
import org.kie.server.services.jbpm.ui.FormServiceBase;
import org.kie.server.services.jbpm.ui.api.UIFormProvider;
public class RemoteKieFormsProvider extends AbstractFormProvider implements UIFormProvider {
public static final String SUBFORM = "SubForm";
public static final String SUBFORM_FORM_PROPERTY = "nestedForm";
public static final String MULTIPLE_SUBFORM = "MultipleSubForm";
public static final String MULTIPLE_SUBFORM_CREATION_FORM_PROPERTY = "creationForm";
public static final String MULTIPLE_SUBFORM_EDITION_FORM_PROPERTY = "editionForm";
protected JsonParser parser = new JsonParser();
protected Gson gson = new Gson();
@Override
public int getPriority() {
return 0;
}
@Override
public String getType() {
return FormServiceBase.FormType.FORM_TYPE.getName();
}
@Override
public void configure( FormManagerService formManagerService ) {
this.formManagerService = formManagerService;
}
@Override
public String render( String name, ProcessDefinition process, Map<String, Object> renderContext ) {
if (!(process instanceof ProcessAssetDesc )) {
return null;
}
return render( process.getId() + getFormSuffix(), process.getDeploymentId() );
}
@Override
public String render( String name, Task task, ProcessDefinition process, Map<String, Object> renderContext ) {
String lookupName = getTaskFormName( task );
if ( lookupName == null || lookupName.isEmpty()) return null;
return render( lookupName, task.getTaskData().getDeploymentId() );
}
protected String render( String formName, String deploymentId ) {
String formContent = formManagerService.getFormByKey( deploymentId, formName);
if ( !StringUtils.isEmpty( formContent ) ) {
return generateRenderingContextString( formContent, formManagerService.getAllFormsByDeployment( deploymentId ) );
}
return null;
}
protected String generateRenderingContextString( String formContent, Map<String, String> availableForms ) {
Map<String, Object> contextForms = new HashMap<>();
Collection<String> result = availableForms.entrySet().stream().filter( entry -> entry.getKey().endsWith( getFormExtension() ) ).collect( Collectors.toMap( p -> p.getKey(), p -> p.getValue()) ).values();
parseFormContent( parser.parse( formContent ).getAsJsonObject(), contextForms, result );
return gson.toJson( contextForms.values() );
}
protected void parseFormContent( JsonObject jsonForm, Map<String, Object> contextForms, Collection<String> availableForms ) {
String id = jsonForm.get( "id" ).getAsString();
if ( !contextForms.containsKey( id ) ) {
contextForms.put( id, jsonForm );
}
JsonArray fields = jsonForm.get( "fields" ).getAsJsonArray();
fields.forEach( jsonElement -> {
JsonObject object = jsonElement.getAsJsonObject();
if ( object != null ) {
String code = object.get( "code" ).getAsString();
if( SUBFORM.equals( code ) ) {
String id1 = object.get( SUBFORM_FORM_PROPERTY ).getAsString();
parseFormContent( id1, contextForms, availableForms );
} else if ( MULTIPLE_SUBFORM.equals( code ) ) {
String id1 = object.get( MULTIPLE_SUBFORM_CREATION_FORM_PROPERTY ).getAsString();
parseFormContent( id1, contextForms, availableForms );
id1 = object.get( MULTIPLE_SUBFORM_EDITION_FORM_PROPERTY ).getAsString();
parseFormContent( id1, contextForms, availableForms );
}
}
} );
}
protected void parseFormContent( String formId, Map<String, Object> contextForms, Collection<String> availableForms ) {
if ( !StringUtils.isEmpty( formId ) && !contextForms.containsKey( formId )) {
JsonObject jsonForm = findForm( formId, availableForms );
if ( jsonForm != null ) {
parseFormContent( jsonForm, contextForms, availableForms );
}
}
}
protected JsonObject findForm( String id, Collection<String> availableForms ) {
for ( Iterator<String> it = availableForms.iterator(); it.hasNext(); ) {
String formContent = it.next();
JsonObject jsonForm = parser.parse( formContent ).getAsJsonObject();
if ( id.equals( jsonForm.get( "id" ).getAsString() ) ) {
it.remove();
return jsonForm;
}
}
return null;
}
@Override
protected String getFormExtension() {
return ".frm";
}
}