blob: 40e2f571723eefbe9336db203575ceaeb4a8f19d [file] [log] [blame]
/*
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you 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.apache.ambari.logsearch.manager;
import java.util.ArrayList;
import java.util.Collection;
import java.util.List;
import java.util.UUID;
import org.apache.ambari.logsearch.common.LogSearchContext;
import org.apache.ambari.logsearch.dao.MetadataSolrDao;
import org.apache.ambari.logsearch.model.request.impl.MetadataRequest;
import org.apache.ambari.logsearch.model.response.LogsearchMetaData;
import org.apache.commons.lang.StringUtils;
import org.apache.commons.lang3.builder.ToStringBuilder;
import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;
import org.apache.solr.client.solrj.SolrQuery;
import org.apache.solr.common.SolrDocument;
import org.apache.solr.common.SolrDocumentList;
import org.apache.solr.common.SolrInputDocument;
import org.springframework.core.convert.ConversionService;
import javax.inject.Inject;
import javax.inject.Named;
import static org.apache.ambari.logsearch.solr.SolrConstants.MetadataConstants.ID;
import static org.apache.ambari.logsearch.solr.SolrConstants.MetadataConstants.USER_NAME;
import static org.apache.ambari.logsearch.solr.SolrConstants.MetadataConstants.VALUE;
import static org.apache.ambari.logsearch.solr.SolrConstants.MetadataConstants.NAME;
import static org.apache.ambari.logsearch.solr.SolrConstants.MetadataConstants.TYPE;
@Named
public class MetadataManager extends JsonManagerBase {
private static final Logger logger = LogManager.getLogger(MetadataManager.class);
@Inject
private MetadataSolrDao metadataSolrDao;
@Inject
private ConversionService conversionService;
public String saveMetadata(Collection<LogsearchMetaData> logsearchMetaDataList) {
List<SolrInputDocument> solrInputDocList = new ArrayList<>();
for (LogsearchMetaData metaData : logsearchMetaDataList) {
solrInputDocList.add(createMetadata(metaData));
}
metadataSolrDao.addDocs(solrInputDocList);
return convertObjToString(solrInputDocList);
}
public String saveMetadata(LogsearchMetaData metadata) {
SolrInputDocument solrInputDocument = createMetadata(metadata);
metadataSolrDao.addDoc(solrInputDocument);
return convertObjToString(solrInputDocument);
}
private SolrInputDocument createMetadata(LogsearchMetaData metadata) {
String name = metadata.getName();
SolrInputDocument solrInputDoc = new SolrInputDocument();
if (!isValid(metadata, false)) {
throw new MalformedInputException("Name,type and value should be specified, input:" + ToStringBuilder.reflectionToString(metadata));
}
final String userName = LogSearchContext.getCurrentUsername().toLowerCase();
solrInputDoc.addField(ID, generateUniqueId(metadata, userName));
solrInputDoc.addField(USER_NAME, userName);
solrInputDoc.addField(VALUE, metadata.getValue());
solrInputDoc.addField(NAME, name);
solrInputDoc.addField(TYPE, metadata.getType());
logger.info("Created metadata: name: {}, type: {}, user: {}", name, metadata.getType(), userName);
return solrInputDoc;
}
public void deleteMetadata(Collection<LogsearchMetaData> metaDataList) {
for (LogsearchMetaData metaData : metaDataList) {
deleteMetadata(metaData);
}
}
public void deleteMetadata(LogsearchMetaData metaData) {
if (!isValid(metaData, true)) {
throw new MalformedInputException("Name and type should be specified, input: " + ToStringBuilder.reflectionToString(metaData));
}
final String userName;
if (StringUtils.isNotBlank(metaData.getUserName())) {
userName = metaData.getUserName();
} else {
userName = LogSearchContext.getCurrentUsername();
}
metadataSolrDao.deleteMetadata(metaData.getName(), metaData.getType(), userName);
}
public LogsearchMetaData getMetadata(MetadataRequest request) {
Collection<LogsearchMetaData> metadataList = getMetadataObjects(request, true);
if (metadataList.isEmpty()) {
throw new NotFoundException("Not found any metadata objects with these inputs.");
} else {
return metadataList.iterator().next();
}
}
public Collection<LogsearchMetaData> getMetadataList(MetadataRequest request) {
return getMetadataObjects(request, false);
}
@SuppressWarnings("unchecked")
private Collection<LogsearchMetaData> getMetadataObjects(MetadataRequest request, boolean requireNameField) {
SolrQuery metadataQueryQuery = conversionService.convert(request, SolrQuery.class);
final String userName;
if (StringUtils.isNotBlank(request.getUserName())) {
userName = request.getUserName();
} else {
userName = LogSearchContext.getCurrentUsername();
}
if (StringUtils.isBlank(userName)) {
throw new IllegalArgumentException("User name is not found for metadata request.");
}
if (requireNameField && StringUtils.isBlank(request.getName())) {
throw new MalformedInputException("Name field is a required request parameter.");
}
metadataQueryQuery.addFilterQuery(String.format("%s:%s", USER_NAME, userName.toLowerCase()));
SolrDocumentList solrList = metadataSolrDao.process(metadataQueryQuery).getResults();
Collection<LogsearchMetaData> metadataList = new ArrayList<>();
for (SolrDocument solrDoc : solrList) {
LogsearchMetaData metadata = new LogsearchMetaData();
metadata.setName(solrDoc.get(NAME).toString());
metadata.setId(solrDoc.get(ID).toString());
metadata.setValue(solrDoc.getOrDefault(VALUE, "").toString());
metadata.setType(solrDoc.get(TYPE).toString());
metadata.setUserName(solrDoc.get(USER_NAME).toString());
metadataList.add(metadata);
}
return metadataList;
}
private String generateUniqueId(LogsearchMetaData metaData, String userName) {
String strToUUID = metaData.getName() +
metaData.getType() +
userName;
return UUID.nameUUIDFromBytes(strToUUID.getBytes()).toString();
}
private boolean isValid(LogsearchMetaData mData, boolean skipValueCheck) {
return StringUtils.isNotBlank(mData.getName())
&& StringUtils.isNotBlank(mData.getType())
&& (skipValueCheck || StringUtils.isNotBlank(mData.getValue()));
}
}