/*
* Copyright 2014 JBoss Inc
*
* 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.overlord.dtgov.ui.server.services;
import java.util.ArrayList;
import java.util.Calendar;
import java.util.List;
import javax.inject.Inject;
import org.apache.commons.lang.StringUtils;
import org.jboss.errai.bus.server.annotations.Service;
import org.oasis_open.docs.s_ramp.ns.s_ramp_v1.BaseArtifactType;
import org.overlord.dtgov.common.model.DtgovModel;
import org.overlord.dtgov.ui.client.shared.beans.ProcessBean;
import org.overlord.dtgov.ui.client.shared.beans.ProcessStatusEnum;
import org.overlord.dtgov.ui.client.shared.beans.ProcessesFilterBean;
import org.overlord.dtgov.ui.client.shared.beans.ProcessesResultSetBean;
import org.overlord.dtgov.ui.client.shared.exceptions.DtgovUiException;
import org.overlord.dtgov.ui.client.shared.services.IProcessService;
import org.overlord.dtgov.ui.server.services.dtgov.DtGovClientAccessor;
import org.overlord.dtgov.ui.server.services.dtgov.IDtgovClient;
import org.overlord.dtgov.ui.server.services.sramp.SrampApiClientAccessor;
import org.overlord.sramp.atom.err.SrampAtomException;
import org.overlord.sramp.client.SrampAtomApiClient;
import org.overlord.sramp.client.SrampClientException;
import org.overlord.sramp.client.SrampClientQuery;
import org.overlord.sramp.client.query.ArtifactSummary;
import org.overlord.sramp.client.query.QueryResultSet;
import org.overlord.sramp.common.SrampModelUtils;
/**
* Concrete implementation of the process service interface.
*
* @author David Virgil Naranjo
*/
@Service
public class ProcessService implements IProcessService {
private static final int PAGE_SIZE = 10;
@Inject
private SrampApiClientAccessor _srampClientAccessor;
@Inject
private DtGovClientAccessor _dtgovClientAccessor;
/**
* @see org.overlord.dtgov.ui.client.shared.services.IProcessService#search(org.overlord.dtgov.ui.client.shared.beans.ProcessesFilterBean, int, java.lang.String, boolean)
*/
@Override
public ProcessesResultSetBean search(ProcessesFilterBean filters, int page, String sortColumnId, boolean sortAscending) throws DtgovUiException {
int pageSize = PAGE_SIZE;
int req_startIndex = (page - 1) * pageSize;
SrampClientQuery query = null;
query = createQuery(filters);
SrampClientQuery scq = query.startIndex(req_startIndex).orderBy(sortColumnId);
if (sortAscending) {
scq = scq.ascending();
} else {
scq = scq.descending();
}
QueryResultSet resultSet = null;
try {
resultSet = scq.count(pageSize + 1).query();
} catch (SrampClientException e) {
throw new DtgovUiException(e);
} catch (SrampAtomException e) {
throw new DtgovUiException(e);
}
ProcessesResultSetBean bean=new ProcessesResultSetBean();
List<ProcessBean> processes = new ArrayList<ProcessBean>();
for (ArtifactSummary summary : resultSet) {
String status = summary.getCustomPropertyValue(DtgovModel.CUSTOM_PROPERTY_STATUS);
String workflow = summary.getCustomPropertyValue(DtgovModel.CUSTOM_PROPERTY_WORKFLOW);
String artifactName = summary.getCustomPropertyValue(DtgovModel.CUSTOM_PROPERTY_ARTIFACT_NAME);
String artifactId = summary.getCustomPropertyValue(DtgovModel.CUSTOM_PROPERTY_ARTIFACT_ID);
ProcessBean processBean = new ProcessBean(summary.getUuid(), workflow, artifactName, artifactId, ProcessStatusEnum.valueOf(status));
processes.add(processBean);
}
boolean hasMorePages = false;
if (processes.size() > pageSize) {
processes.remove(processes.get(processes.size() - 1));
hasMorePages = true;
}
// Does the server support opensearch style attributes? If so,
// use that information. Else figure it out from the request params.
if (resultSet.getTotalResults() != -1) {
bean.setItemsPerPage(pageSize);
bean.setStartIndex(resultSet.getStartIndex());
bean.set_totalResults(resultSet.getTotalResults());
} else {
bean.setItemsPerPage(pageSize);
bean.set_totalResults(hasMorePages ? pageSize + 1 : processes.size());
bean.setStartIndex(req_startIndex);
}
bean.setProcesses(processes);
return bean;
}
/**
* @see org.overlord.dtgov.ui.client.shared.services.IProcessService#abort(java.lang.String)
*/
@Override
public boolean abort(String uuid) throws DtgovUiException {
BaseArtifactType artifact;
try {
artifact = _srampClientAccessor.getClient().getArtifactMetaData(uuid);
} catch (SrampClientException e1) {
throw new DtgovUiException(e1);
} catch (SrampAtomException e1) {
throw new DtgovUiException(e1);
}
if (artifact != null) {
String processId = SrampModelUtils.getCustomProperty(artifact, DtgovModel.CUSTOM_PROPERTY_PROCESS_ID);
String targetUUID = SrampModelUtils.getCustomProperty(artifact, DtgovModel.CUSTOM_PROPERTY_ARTIFACT_ID);
IDtgovClient client = _dtgovClientAccessor.getClient();
try {
client.stopProcess(targetUUID, new Long(processId));
} catch (Exception e) {
throw new DtgovUiException(e);
}
return true;
} else {
return false;
}
}
/**
* Creates the query.
*
* @param filters
* the filters
* @return the sramp client query
*/
private SrampClientQuery createQuery(ProcessesFilterBean filters) {
StringBuilder queryBuilder = new StringBuilder();
// Initial query
queryBuilder.append("/s-ramp/ext/" + DtgovModel.WorkflowInstanceType); //$NON-NLS-1$
List<Object> params = new ArrayList<Object>();
if (filters != null) {
List<String> criteria = new ArrayList<String>();
if (filters.getArtifact() != null && filters.getArtifact().trim().length() > 0) {
criteria.add("fn:matches(@" + DtgovModel.CUSTOM_PROPERTY_ARTIFACT_NAME + ", ?)"); //$NON-NLS-1$ //$NON-NLS-2$
params.add(filters.getArtifact().replace("*", ".*")); //$NON-NLS-1$ //$NON-NLS-2$
}
if (StringUtils.isNotBlank(filters.getWorkflow())) {
criteria.add("@" + DtgovModel.CUSTOM_PROPERTY_WORKFLOW + " = ?"); //$NON-NLS-1$ //$NON-NLS-2$
params.add(filters.getWorkflow());
}
if (filters.getStatus() != null) {
criteria.add("@" + DtgovModel.CUSTOM_PROPERTY_STATUS + " = ?"); //$NON-NLS-1$ //$NON-NLS-2$
params.add(filters.getStatus().name());
}
// Now create the query predicate from the generated criteria
if (criteria.size() > 0) {
queryBuilder.append("["); //$NON-NLS-1$
queryBuilder.append(StringUtils.join(criteria, " and ")); //$NON-NLS-1$
queryBuilder.append("]"); //$NON-NLS-1$
}
}
// Create the query, and parameterize it
SrampAtomApiClient client = _srampClientAccessor.getClient();
SrampClientQuery query = client.buildQuery(queryBuilder.toString());
for (Object param : params) {
if (param instanceof String) {
query.parameter((String) param);
}
if (param instanceof Calendar) {
query.parameter((Calendar) param);
}
}
query.propertyName(DtgovModel.CUSTOM_PROPERTY_ARTIFACT_ID);
query.propertyName(DtgovModel.CUSTOM_PROPERTY_ARTIFACT_NAME);
query.propertyName(DtgovModel.CUSTOM_PROPERTY_WORKFLOW);
query.propertyName(DtgovModel.CUSTOM_PROPERTY_STATUS);
return query;
}
/**
* Gets the sramp client accessor.
*
* @return the sramp client accessor
*/
public SrampApiClientAccessor getSrampClientAccessor() {
return _srampClientAccessor;
}
/**
* Sets the sramp client accessor.
*
* @param srampClientAccessor
* the new sramp client accessor
*/
public void setSrampClientAccessor(SrampApiClientAccessor srampClientAccessor) {
this._srampClientAccessor = srampClientAccessor;
}
/**
* Gets the dtgov client accessor.
*
* @return the dtgov client accessor
*/
public DtGovClientAccessor getDtgovClientAccessor() {
return _dtgovClientAccessor;
}
/**
* Sets the dtgov client accessor.
*
* @param dtgovClientAccessor
* the new dtgov client accessor
*/
public void setDtgovClientAccessor(DtGovClientAccessor dtgovClientAccessor) {
this._dtgovClientAccessor = dtgovClientAccessor;
}
}