/**
*
* Copyright
* 2009-2015 Jayway Products AB
* 2016-2017 Föreningen Sambruk
*
* Licensed under AGPL, Version 3.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.gnu.org/licenses/agpl.txt
*
* 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 se.streamsource.streamflow.web.context.workspace.cases.general;
import org.qi4j.api.common.Optional;
import org.qi4j.api.injection.scope.Service;
import org.qi4j.api.injection.scope.Structure;
import org.qi4j.api.service.ServiceImporterException;
import org.qi4j.api.service.ServiceReference;
import org.qi4j.api.structure.Module;
import org.qi4j.api.value.ValueBuilder;
import se.streamsource.dci.api.DeleteContext;
import se.streamsource.dci.api.IndexContext;
import se.streamsource.dci.api.ServiceAvailable;
import se.streamsource.dci.api.SkipResourceValidityCheck;
import se.streamsource.dci.value.link.LinkValue;
import se.streamsource.streamflow.api.administration.form.KnownDatatypeDefinitionUrls;
import se.streamsource.streamflow.api.workspace.cases.contact.StreetSearchDTO;
import se.streamsource.streamflow.api.workspace.cases.contact.StreetsDTO;
import se.streamsource.streamflow.api.workspace.cases.form.AttachmentFieldDTO;
import se.streamsource.streamflow.api.workspace.cases.general.FieldSubmissionDTO;
import se.streamsource.streamflow.api.workspace.cases.general.FieldSubmissionPluginDTO;
import se.streamsource.streamflow.api.workspace.cases.general.FieldValueDTO;
import se.streamsource.streamflow.api.workspace.cases.general.FormDraftDTO;
import se.streamsource.streamflow.api.workspace.cases.general.FormDraftSettingsDTO;
import se.streamsource.streamflow.api.workspace.cases.general.PageSubmissionDTO;
import se.streamsource.streamflow.server.plugin.address.StreetList;
import se.streamsource.streamflow.server.plugin.address.StreetValue;
import se.streamsource.streamflow.util.Strings;
import se.streamsource.streamflow.web.application.defaults.SystemDefaultsService;
import se.streamsource.streamflow.web.domain.structure.form.FormDraft;
import se.streamsource.streamflow.web.domain.structure.form.FormDrafts;
import se.streamsource.streamflow.web.domain.structure.form.SubmittedForms;
import se.streamsource.streamflow.web.domain.structure.form.Submitter;
import se.streamsource.streamflow.web.infrastructure.plugin.KartagoPluginConfiguration;
import se.streamsource.streamflow.web.infrastructure.plugin.address.StreetAddressLookupService;
import se.streamsource.streamflow.web.infrastructure.plugin.map.KartagoMapService;
import java.io.IOException;
import java.util.List;
import static se.streamsource.dci.api.RoleMap.*;
/**
* JAVADOC
*/
public class CaseFormDraftContext implements DeleteContext, IndexContext<FormDraftDTO>
{
@Optional
@Service
KartagoMapService kartagoMapService;
@Optional
@Service
ServiceReference<StreetAddressLookupService> streetLookup;
@Structure
Module module;
@Service
SystemDefaultsService systemDefaults;
public FormDraftDTO index()
{
FormDraft formDraft = role( FormDraft.class );
FormDraftDTO draft = formDraft.getFormDraftValue();
ValueBuilder<FormDraftDTO> draftBuilder = module.valueBuilderFactory().newValueBuilder( FormDraftDTO.class ).withPrototype( draft );
boolean visibilityrule = false;
int pageIndex = -1;
for (PageSubmissionDTO pageSubmissionDTO : draft.pages().get())
{
pageIndex++;
if ( pageSubmissionDTO.rule().get() != null && !Strings.empty( pageSubmissionDTO.rule().get().field().get() ) )
{
visibilityrule = true;
}
int fieldIndex = -1;
for (FieldSubmissionDTO field : pageSubmissionDTO.fields().get())
{
fieldIndex++;
if ( field.field().get().rule().get() != null && !Strings.empty( field.field().get().rule().get().field().get() ) )
{
visibilityrule = true;
}
if (KnownDatatypeDefinitionUrls.GEO_LOCATION.equals( field.field().get().datatypeUrl().get())
&& ((KartagoPluginConfiguration) kartagoMapService.configuration()).enabled().get())
{
ValueBuilder<LinkValue> linkValueBuilder = module.valueBuilderFactory()
.newValueBuilder( LinkValue.class );
linkValueBuilder.prototype().href().set( "kartagoclientexe" );
linkValueBuilder.prototype().text().set( "Kartago Plugin" );
linkValueBuilder.prototype().id().set( "kartagoplugin" );
linkValueBuilder.prototype().rel().set( "kartagoplugin" );
ValueBuilder<FieldSubmissionPluginDTO> fieldPluginBuilder = module.valueBuilderFactory()
.newValueBuilder( FieldSubmissionPluginDTO.class );
fieldPluginBuilder.prototype().field().set( field.field().get() );
fieldPluginBuilder.prototype().value().set( field.value().get());
fieldPluginBuilder.prototype().message().set( field.message().get() );
fieldPluginBuilder.prototype().enabled().set( field.enabled().get() );
fieldPluginBuilder.prototype().plugin().set( linkValueBuilder.newInstance() );
draftBuilder.prototype().pages().get().get( pageIndex ).fields().get().set( fieldIndex, fieldPluginBuilder.newInstance() );
}
}
}
draftBuilder.prototype().visibilityrules().set( visibilityrule );
return draftBuilder.newInstance();
}
public void updatefield(FieldValueDTO field)
{
FormDraft formDraft = role( FormDraft.class );
formDraft.changeFieldValue( field.field().get(), field.value().get() );
}
public void updateattachmentfield(AttachmentFieldDTO fieldAttachment)
{
FormDraft formDraft = role( FormDraft.class );
formDraft.changeFieldAttachmentValue( fieldAttachment );
}
public void submit()
{
FormDraft formDraft = role( FormDraft.class );
Submitter submitter = role( Submitter.class );
role( SubmittedForms.class ).submitForm( formDraft, submitter );
}
public void delete() throws IOException
{
FormDrafts formDrafts = role( FormDrafts.class );
FormDraft formDraft = role( FormDraft.class );
formDrafts.discardFormDraft( formDraft );
}
@ServiceAvailable( service = KartagoMapService.class, availability = true )
public String kartagoclientexe()
{
return ((KartagoPluginConfiguration) kartagoMapService.configuration()).installpath().get() ;
}
@ServiceAvailable( service = StreetAddressLookupService.class, availability = true )
@SkipResourceValidityCheck
public StreetsDTO searchstreets(StreetSearchDTO search)
{
ValueBuilder<StreetValue> builder = module.valueBuilderFactory().newValueBuilder(StreetValue.class);
builder.prototype().address().set( search.address().get() );
ValueBuilder<StreetsDTO> resultBuilder = module.valueBuilderFactory().newValueBuilder( StreetsDTO.class );
try
{
if (streetLookup != null)
{
StreetAddressLookupService lookup = streetLookup.get();
StreetList streetList = lookup.lookup( builder.newInstance() );
List<StreetSearchDTO> streets = resultBuilder.prototype().streets().get();
for (StreetValue street : streetList.streets().get())
{
streets.add( module.valueBuilderFactory().newValueFromJSON( StreetSearchDTO.class, street.toJSON() ) );
}
return resultBuilder.newInstance();
} else
{
return resultBuilder.newInstance();
}
} catch (ServiceImporterException e)
{
// Not available at this time
return resultBuilder.newInstance();
}
}
public FormDraftSettingsDTO settings()
{
ValueBuilder<FormDraftSettingsDTO> builder = module.valueBuilderFactory().newValueBuilder( FormDraftSettingsDTO.class );
builder.prototype().location().set( systemDefaults.config().configuration().mapDefaultStartLocation().get() );
builder.prototype().zoomLevel().set( systemDefaults.config().configuration().mapDefaultZoomLevel().get() );
builder.prototype().mapquestReverseLookupUrlPattern().set( systemDefaults.config().configuration().mapquestReverseLookupUrlPattern().get() );
return builder.newInstance();
}
}