/* * 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.workbench.common.services.refactoring.backend.server.indexing; import java.util.Collection; import java.util.Collections; import java.util.Set; import javax.inject.Inject; import javax.inject.Named; import org.guvnor.common.services.project.model.Package; import org.guvnor.common.services.project.model.Project; import org.kie.workbench.common.services.refactoring.backend.server.impact.ResourceReferenceCollector; import org.kie.workbench.common.services.refactoring.backend.server.util.KObjectUtil; import org.kie.workbench.common.services.refactoring.model.index.ResourceReference; import org.kie.workbench.common.services.refactoring.model.index.Resource; import org.kie.workbench.common.services.refactoring.model.index.SharedPart; import org.kie.workbench.common.services.shared.project.KieProjectService; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.uberfire.backend.server.util.Paths; import org.uberfire.commons.data.Pair; import org.uberfire.ext.metadata.engine.Indexer; import org.uberfire.ext.metadata.model.KObject; import org.uberfire.ext.metadata.model.KObjectKey; import org.uberfire.io.IOService; import org.uberfire.java.nio.file.Path; /** * All (KIE) {@link Indexer} implementations should extend this class. */ public abstract class AbstractFileIndexer implements Indexer { private static final Logger logger = LoggerFactory.getLogger(AbstractFileIndexer.class); @Inject @Named("ioStrategy") protected IOService ioService; @Inject protected KieProjectService projectService; /** * This method fills a {@link DefaultIndexBuilder} instance with the default information. * If the index builder could not be built, it should either throw an exception or return null. * * @param path The {@link Path} of the resource to be indexed. * @return A {@link DefaultIndexBuilder} instance with the information to be indexed * @throws Exception if something goes wrong */ protected abstract DefaultIndexBuilder fillIndexBuilder( final Path path ) throws Exception; /** * This method should not be overridden by implementation classes! * </p> * However, we can not make this method final because otherwise Weld/Errai will complain * when they try to make proxy beans. */ @Override public KObject toKObject( Path path ) { KObject index = null; try { // create a builder with the default information DefaultIndexBuilder builder = fillIndexBuilder(path); Set<Pair<String, String>> indexElements = null; if( builder != null ) { // build index document indexElements = builder.build(); } else { indexElements = Collections.emptySet(); } index = KObjectUtil.toKObject(path, indexElements); } catch( Exception e ) { // Unexpected parsing or processing error logger.error("Unable to index '" + path.toUri().toString() + "'.", e.getMessage(), e); } return index; } protected DefaultIndexBuilder getIndexBuilder(Path path) { final Project project = projectService.resolveProject( Paths.convert( path ) ); if ( project == null ) { logger.error( "Unable to index " + path.toUri().toString() + ": project could not be resolved." ); return null; } final Package pkg = projectService.resolvePackage( Paths.convert( path ) ); if ( pkg == null ) { logger.error( "Unable to index " + path.toUri().toString() + ": package could not be resolved." ); return null; } // responsible for basic index info: project name, branch, etc return new DefaultIndexBuilder(Paths.convert(path).getFileName(), project, pkg); } /** * This method adds the index terms necessary for impact analysis to the {@link DefaultIndexBuilder}, which is basically * the lucene doc for a resource. * * @param builder The {@link DefaultIndexBuilder} instance for a resource * @param resRefCollector A collector containing info (resources, references) on the asset indexed * to other resources that an indexed resource has. */ protected void addReferencedResourcesToIndexBuilder( DefaultIndexBuilder builder, ResourceReferenceCollector resRefCollector ) { Collection<ResourceReference> referencedResources = resRefCollector.getResourceReferences(); if( ! referencedResources.isEmpty() ) { for( ResourceReference resourceRef : referencedResources ) { builder.addGenerator(resourceRef); } } Collection<SharedPart> sharedReferences = resRefCollector.getSharedReferences(); if( ! sharedReferences.isEmpty() ) { for( SharedPart sharedRef : sharedReferences ) { builder.addGenerator(sharedRef); } } Collection<Resource> resources = resRefCollector.getResources(); if( ! resources.isEmpty() ) { for( Resource res : resources ) { builder.addGenerator(res); } } } /** * This method should not be overridden by implementing classes! * </p> * However, we can not make this method final because otherwise Weld/Errai will complain * when they try to make proxy beans. */ @Override public KObjectKey toKObjectKey( final Path path ) { return KObjectUtil.toKObjectKey(path); } }