/* * Copyright 2014 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.screens.contributors.backend.dataset; import java.io.IOException; import java.io.InputStream; import java.util.Collection; import java.util.Date; import java.util.List; import java.util.Map; import java.util.Properties; import javax.annotation.PostConstruct; import javax.enterprise.context.ApplicationScoped; import javax.enterprise.event.Event; import javax.enterprise.event.Observes; import javax.inject.Inject; import org.dashbuilder.dataset.DataSet; import org.dashbuilder.dataset.DataSetBuilder; import org.dashbuilder.dataset.DataSetFactory; import org.dashbuilder.dataset.DataSetGenerator; import org.dashbuilder.dataset.def.DataColumnDef; import org.dashbuilder.dataset.def.DataSetDef; import org.dashbuilder.dataset.def.DataSetDefRegistry; import org.dashbuilder.dataset.events.DataSetStaleEvent; import org.guvnor.structure.organizationalunit.NewOrganizationalUnitEvent; import org.guvnor.structure.organizationalunit.OrganizationalUnit; import org.guvnor.structure.organizationalunit.OrganizationalUnitService; import org.guvnor.structure.organizationalunit.RemoveOrganizationalUnitEvent; import org.guvnor.structure.organizationalunit.RepoAddedToOrganizationalUnitEvent; import org.guvnor.structure.organizationalunit.RepoRemovedFromOrganizationalUnitEvent; import org.guvnor.structure.repositories.Repository; import org.guvnor.structure.repositories.RepositoryService; import org.uberfire.commons.services.cdi.Startup; import org.uberfire.java.nio.base.version.VersionRecord; import org.uberfire.workbench.events.ResourceAddedEvent; import org.uberfire.workbench.events.ResourceBatchChangesEvent; import org.uberfire.workbench.events.ResourceCopiedEvent; import org.uberfire.workbench.events.ResourceDeletedEvent; import org.uberfire.workbench.events.ResourceRenamedEvent; import org.uberfire.workbench.events.ResourceUpdatedEvent; import static org.kie.workbench.common.screens.contributors.model.ContributorsDataSetColumns.*; import static org.kie.workbench.common.screens.contributors.model.ContributorsDataSets.*; import static org.uberfire.commons.validation.PortablePreconditions.*; /** * This class is in charge of the initialization of a data set holding all the * contributions made to any of the GIT managed repositories. */ @Startup @ApplicationScoped public class ContributorsManager implements DataSetGenerator { @Inject protected DataSetDefRegistry dataSetDefRegistry; @Inject protected OrganizationalUnitService organizationalUnitService; @Inject protected RepositoryService repositoryService; @Inject protected Event<DataSetStaleEvent> dataSetStaleEvent; /** * Map holding alias to author name mappings */ protected Properties authorMappings = new Properties(); /** * The GIT contributors data set definition */ protected DataSetDef dataSetdef = DataSetFactory.newBeanDataSetDef() .uuid(GIT_CONTRIB) .name("GIT Contributors") .generatorClass(ContributorsManager.class.getName()) .label(COLUMN_ORG) .label(COLUMN_REPO) .label(COLUMN_AUTHOR) .text(COLUMN_MSG) .date(COLUMN_DATE) .buildDef(); @PostConstruct protected void init() { dataSetdef.setPublic(false); dataSetDefRegistry.registerDataSetDef(dataSetdef); InputStream is = Thread.currentThread().getContextClassLoader().getResourceAsStream("author_mappings.properties"); if (is != null) { try { authorMappings.load(is); } catch (IOException e) { e.printStackTrace(); } } } @Override public DataSet buildDataSet(Map<String, String> params) { DataSetBuilder dsBuilder = DataSetFactory.newDataSetBuilder(); for (DataColumnDef columnDef : dataSetdef.getColumns()) { dsBuilder.column(columnDef.getId(), columnDef.getColumnType()); } Collection<OrganizationalUnit> orgUnitList = organizationalUnitService.getOrganizationalUnits(); for (OrganizationalUnit orgUnit : orgUnitList) { String org = orgUnit.getName(); Collection<Repository> repoList = orgUnit.getRepositories(); if (repoList.isEmpty()) { dsBuilder.row(org, null, null, "Empty organizational unit", null); } else { for (Repository repo : repoList) { String repoAlias = repo.getAlias(); List<VersionRecord> recordList = repositoryService.getRepositoryHistoryAll(repoAlias); if (recordList.isEmpty()) { dsBuilder.row(org, repoAlias, null, "Empty repository", null); } else { for (VersionRecord record : recordList) { String alias = record.author(); String author = authorMappings.getProperty(alias); if (author == null) author = alias; String msg = record.comment(); Date date = record.date(); dsBuilder.row(org, repoAlias, author, msg, date); } } } } } DataSet dataSet = dsBuilder.buildDataSet(); dataSet.setUUID(GIT_CONTRIB); return dataSet; } protected void invalidateDataSet() { dataSetStaleEvent.fire(new DataSetStaleEvent(dataSetdef)); } // Keep synced the contributions data set with the changes made into the org>repos>commits hierarchy public void onRepoAddedToOrgUnit(@Observes final RepoAddedToOrganizationalUnitEvent event) { checkNotNull("event", event); invalidateDataSet(); } public void onRepoRemovedFromOrgUnit(@Observes final RepoRemovedFromOrganizationalUnitEvent event) { checkNotNull("event", event); invalidateDataSet(); } public void onOrganizationUnitAdded(@Observes final NewOrganizationalUnitEvent event) { checkNotNull("event", event); invalidateDataSet(); } public void onOrganizationUnitRemoved(@Observes final RemoveOrganizationalUnitEvent event) { checkNotNull("event", event); invalidateDataSet(); } public void processResourceAdd(@Observes final ResourceAddedEvent event) { checkNotNull("event", event); invalidateDataSet(); } public void processResourceDelete(@Observes final ResourceDeletedEvent event) { checkNotNull("event", event); invalidateDataSet(); } public void processResourceUpdate(@Observes final ResourceUpdatedEvent event) { checkNotNull("event", event); invalidateDataSet(); } public void processResourceCopied(@Observes final ResourceCopiedEvent event) { checkNotNull("event", event); invalidateDataSet(); } public void processResourceRenamed(@Observes final ResourceRenamedEvent event) { checkNotNull("event", event); invalidateDataSet(); } public void processBatchChanges(@Observes final ResourceBatchChangesEvent event) { checkNotNull("event", event); invalidateDataSet(); } }