/*
* Copyright 2008-${YEAR} Zuse Institute Berlin (ZIB)
*
* 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 de.zib.gndms.GORFX.service;
import de.zib.gndms.common.model.gorfx.types.Order;
import de.zib.gndms.common.model.gorfx.types.Quote;
import de.zib.gndms.kit.config.MandatoryOptionMissingException;
import de.zib.gndms.logic.model.gorfx.AbstractQuoteCalculator;
import de.zib.gndms.logic.model.gorfx.taskflow.TaskFlowFactory;
import de.zib.gndms.logic.model.gorfx.taskflow.TaskFlowProvider;
import de.zib.gndms.model.common.PersistentContract;
import de.zib.gndms.model.gorfx.types.DelegatingOrder;
import de.zib.gndms.neomodel.common.Dao;
import de.zib.gndms.neomodel.common.Session;
import de.zib.gndms.neomodel.gorfx.Task;
import de.zib.gndms.neomodel.gorfx.TaskFlow;
import org.springframework.http.HttpStatus;
import java.util.List;
import java.util.UUID;
public final class TaskFlowServiceAux {
public static <T extends Order> HttpStatus setAndValidateOrder( Order order, TaskFlow<T> taskFlow, TaskFlowFactory<T, ?> factory ) {
DelegatingOrder<T> delegate = setOrderAsDelegate( order, taskFlow, factory );
delegate.setActId( UUID.randomUUID().toString() );
return validateOrder( factory, delegate );
}
public static <T extends Order> DelegatingOrder<T> setOrderAsDelegate( Order order, TaskFlow<T> taskFlow, TaskFlowFactory<T, ?> factory ) {
Class<T> orderClass = factory.getOrderClass();
if( taskFlow.getOrder() == null ) {
DelegatingOrder<T> delegate = factory.getOrderDelegate( orderClass.cast( order ) );
taskFlow.setOrder( delegate );
}
else
taskFlow.getOrder().setOrderBean( orderClass.cast( order ) );
return taskFlow.getOrder();
}
public static <T extends Order> HttpStatus validateOrder( TaskFlowFactory<T, ?> factory, DelegatingOrder<T> delegate ) {
final AbstractQuoteCalculator<T> qc;
try {
qc = factory.getQuoteCalculator();
}
catch( MandatoryOptionMissingException e ) {
return HttpStatus.BAD_REQUEST;
}
qc.setOrder( delegate );
try {
if ( qc.validate() )
return HttpStatus.OK;
} catch (Exception e) {
return HttpStatus.BAD_REQUEST;
}
return HttpStatus.BAD_REQUEST;
}
public static <T extends Order> List<Quote> createQuotes( TaskFlowFactory<T,?> tff, TaskFlow<T> tf ) throws Exception {
AbstractQuoteCalculator<T> qc = tff.getQuoteCalculator();
qc.setOrder( tf.getOrder() );
List<Quote> quoteList;
if ( tf.hasPreferredQuote() )
quoteList = qc.createQuotes( tf.getPreferredQuote() );
else
quoteList = qc.createQuotes();
tf.setQuotes( quoteList );
return quoteList;
}
private TaskFlowServiceAux(){ }
public static TaskFlow fromTask( final Dao dao, final TaskFlowProvider provider, final String type,
final String id ) {
final Session ses = dao.beginSession();
try {
final Task t = ses.findTaskForResource( id );
if ( t == null )
return null;
final TaskFlowFactory tff = provider.getFactoryForTaskFlow( type );
final TaskFlow tf = tff.createOrphan();
// todo tf.setId( t.getResourceId() );
tf.setOrder( ( DelegatingOrder<?> ) t.getOrder( ) );
tf.addQuote( quoteFromContract( t.getContract() ) );
tf.setTaskling( t.getTaskling() );
tff.adopt( tf );
ses.success();
return tf;
} finally {
ses.finish();
}
}
public static Quote quoteFromContract( PersistentContract contract ) {
return contract.toTransientContract();
}
}