/**
*
* 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.assembler;
import static org.qi4j.api.common.Visibility.application;
import static org.qi4j.bootstrap.ImportedServiceDeclaration.INSTANCE;
import org.apache.commons.fileupload.FileItemFactory;
import org.apache.commons.fileupload.disk.DiskFileItemFactory;
import org.qi4j.api.common.Visibility;
import org.qi4j.api.service.qualifier.ServiceQualifier;
import org.qi4j.api.util.Iterables;
import org.qi4j.bootstrap.AssemblyException;
import org.qi4j.bootstrap.ImportedServiceDeclaration;
import org.qi4j.bootstrap.LayerAssembly;
import org.qi4j.bootstrap.ModuleAssembly;
import org.qi4j.library.rdf.entity.EntityStateSerializer;
import org.qi4j.library.rdf.entity.EntityTypeSerializer;
import org.qi4j.library.rest.EntitiesResource;
import org.qi4j.library.rest.EntityResource;
import org.qi4j.library.rest.IndexResource;
import org.qi4j.library.rest.SPARQLResource;
import org.qi4j.spi.query.NamedEntityFinder;
import org.qi4j.spi.query.NamedQueries;
import org.qi4j.spi.query.NamedQueryDescriptor;
import org.qi4j.spi.service.importer.ServiceSelectorImporter;
import org.restlet.security.ChallengeAuthenticator;
import se.streamsource.dci.restlet.server.DCIAssembler;
import se.streamsource.dci.restlet.server.ResourceFinder;
import se.streamsource.dci.restlet.server.ResultConverter;
import se.streamsource.streamflow.api.workspace.SearchResultDTO;
import se.streamsource.streamflow.util.ClassScanner;
import se.streamsource.streamflow.web.application.defaults.AvailabilityFilter;
import se.streamsource.streamflow.web.application.security.AuthenticationFilter;
import se.streamsource.streamflow.web.infrastructure.index.NamedSolrDescriptor;
import se.streamsource.streamflow.web.rest.StreamflowCaseResponseWriter;
import se.streamsource.streamflow.web.rest.StreamflowRestApplication;
import se.streamsource.streamflow.web.rest.StreamflowRestlet;
import se.streamsource.streamflow.web.rest.StreamflowResultConverter;
import se.streamsource.streamflow.web.rest.resource.APIRouter;
import se.streamsource.streamflow.web.rest.resource.RootResource;
import se.streamsource.streamflow.web.rest.service.conversation.ConversationResponseService;
import se.streamsource.streamflow.web.rest.service.conversation.NotificationService;
import se.streamsource.streamflow.web.rest.service.filter.FilterConfiguration;
import se.streamsource.streamflow.web.rest.service.filter.FilterService;
/**
* JAVADOC
*/
public class WebAssembler
extends AbstractLayerAssembler
{
public void assemble(LayerAssembly layer)
throws AssemblyException
{
super.assemble(layer);
rest(layer.module("REST"));
services(layer.module("Services"));
}
private void rest(ModuleAssembly module) throws AssemblyException
{
module.objects(StreamflowRestApplication.class,
ResourceFinder.class /*,
EntityStateSerializer.class,
EntityTypeSerializer.class */);
module.objects(//SPARQLResource.class,
//IndexResource.class,
EntitiesResource.class,
EntityResource.class);
module.importedServices(ChallengeAuthenticator.class);
NamedQueries namedQueries = new NamedQueries();
NamedQueryDescriptor queryDescriptor = new NamedSolrDescriptor("solrquery", "");
namedQueries.addQuery(queryDescriptor);
module.importedServices(NamedEntityFinder.class).
importedBy( ServiceSelectorImporter.class ).
setMetaInfo( ServiceQualifier.withId( "solr" ) ).
setMetaInfo( namedQueries );
// Resources
module.objects(
APIRouter.class,
AuthenticationFilter.class,
AvailabilityFilter.class
);
new DCIAssembler().assemble(module);
// Import file handling service for file uploads
DiskFileItemFactory factory = new DiskFileItemFactory();
factory.setSizeThreshold(1024 * 1000 * 30); // 30 Mb threshold TODO Make this into real service and make this number configurable
module.importedServices(FileItemFactory.class).importedBy(INSTANCE).setMetaInfo(factory);
module.importedServices(ResultConverter.class).importedBy(ImportedServiceDeclaration.NEW_OBJECT);
module.objects(StreamflowResultConverter.class);
module.importedServices(StreamflowCaseResponseWriter.class).importedBy(ImportedServiceDeclaration.NEW_OBJECT);
module.objects(StreamflowCaseResponseWriter.class);
module.objects(StreamflowRestlet.class).visibleIn(Visibility.application);
// Register all resources
for (Class aClass : Iterables.filter(ClassScanner.matches(".*Resource"), ClassScanner.getClasses(RootResource.class)))
{
module.objects(aClass);
}
}
private void services(ModuleAssembly module)
{
module.services(FilterService.class).identifiedBy("filter").visibleIn(application).instantiateOnStartup();
configuration().entities(FilterConfiguration.class);
module.services( NotificationService.class )
.identifiedBy( "notification" )
.instantiateOnStartup()
.visibleIn(application);
module.services( ConversationResponseService.class )
.identifiedBy("conversationresponse")
.instantiateOnStartup()
.visibleIn(application);
}
}