/* See the NOTICE file distributed with * this work for additional information regarding copyright ownership. * Esri Inc. 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 com.esri.gpt.control.harvest; import com.esri.gpt.catalog.arcgis.metadata.AGSProcessorConfig; import com.esri.gpt.framework.adhoc.AdHocEventList; import com.esri.gpt.framework.adhoc.IAdHocEvent; import com.esri.gpt.catalog.harvest.history.HeCriteria; import com.esri.gpt.catalog.harvest.jobs.HjRecord; import com.esri.gpt.catalog.harvest.protocols.HarvestProtocolArcIms; import com.esri.gpt.catalog.harvest.protocols.HarvestProtocolResource; import com.esri.gpt.catalog.harvest.repository.HrActionCriteria; import com.esri.gpt.catalog.harvest.repository.HrAssertUrlException; import com.esri.gpt.catalog.harvest.repository.HrCompleteUpdateRequest; import com.esri.gpt.catalog.harvest.repository.HrCriteria; import com.esri.gpt.catalog.harvest.repository.HrDeleteRequest; import com.esri.gpt.catalog.harvest.repository.HrHarvestRequest; import com.esri.gpt.catalog.harvest.repository.HrRecord; import com.esri.gpt.catalog.harvest.repository.HrRecord.HarvestFrequency; import com.esri.gpt.catalog.harvest.repository.HrRecord.RecentJobStatus; import com.esri.gpt.catalog.harvest.repository.HrRecords; import com.esri.gpt.catalog.harvest.repository.HrResult; import com.esri.gpt.catalog.harvest.repository.HrSelectRequest; import com.esri.gpt.catalog.management.MmdEnums.ApprovalStatus; import com.esri.gpt.catalog.schema.Schema; import com.esri.gpt.catalog.schema.ValidationException; import com.esri.gpt.control.publication.ManageMetadataController; import com.esri.gpt.control.view.BaseSortDirectionStyleMap; import com.esri.gpt.control.view.SelectablePublishers; import com.esri.gpt.control.view.SortDirectionStyle; import com.esri.gpt.control.webharvest.engine.Statistics; import com.esri.gpt.control.webharvest.protocol.ProtocolFactories; import com.esri.gpt.control.webharvest.protocol.ProtocolFactory; import com.esri.gpt.control.webharvest.protocol.ProtocolInvoker; import com.esri.gpt.control.webharvest.protocol.factories.AgpProtocolFactory; import com.esri.gpt.control.webharvest.validator.IConnectionChecker; import com.esri.gpt.control.webharvest.validator.IValidator; import com.esri.gpt.control.webharvest.validator.MessageCollectorAdaptor; import com.esri.gpt.control.webharvest.validator.ValidatorFactory; import com.esri.gpt.framework.collection.StringSet; import com.esri.gpt.framework.context.ApplicationConfiguration; import com.esri.gpt.framework.context.ApplicationContext; import com.esri.gpt.framework.context.RequestContext; import com.esri.gpt.framework.jsf.FacesContextBroker; import com.esri.gpt.framework.jsf.MessageBroker; import com.esri.gpt.framework.request.SortOption; import com.esri.gpt.framework.security.identity.NotAuthorizedException; import com.esri.gpt.framework.security.identity.local.LocalDao; import com.esri.gpt.framework.security.principal.Publisher; import com.esri.gpt.framework.security.principal.User; import com.esri.gpt.framework.security.principal.Users; import com.esri.gpt.framework.util.TimePeriod; import com.esri.gpt.framework.util.UuidUtil; import com.esri.gpt.framework.util.Val; import java.sql.SQLException; import java.text.ParseException; import java.util.ArrayList; import java.util.logging.Level; import javax.faces.application.FacesMessage; import javax.faces.component.UIComponent; import javax.faces.context.ExternalContext; import javax.faces.event.AbortProcessingException; import javax.faces.event.ActionEvent; import javax.faces.model.SelectItem; import javax.xml.transform.TransformerException; import org.xml.sax.SAXException; /** * Harvest controller. Provides functionality to support *.jsp pages to list, * and edit harvest repository data. */ public class HarvestController extends BaseHarvestController { // class variables ============================================================= /** * action expression */ private static final String ACTION_EXPRESSION = "#{HarvestController.handleListRepositories}"; /** * change expression */ private static final String CHANGE_EXPRESSION = "#{HarvestController.pageCursorPanel.onChange}"; private static String _timeCodes = ""; // instance variables ========================================================== /** * Harvest result. */ private HrResult _result = new HrResult(); /** * Repository editor. */ private HarvestEditor _editor = new HarvestEditor(new HrRecord()); /** * Sort direction style map. */ private BaseSortDirectionStyleMap _sortDirectionStyleMap = new SortDirectionStyleMapImpl(); /** * Selectable publishers */ private SelectablePublishers _selectablePublishers = new SelectablePublishers(); /** * Selectable publishers build */ private boolean _selectablePublishersBuild; /** * synchronization status */ private String synchronizationStatus = "none"; /** * info enabled */ private boolean infoEnabled = false; private ManageMetadataController mmController; // constructors ================================================================ /** * Creates instance of the controller. */ public HarvestController() { super(ACTION_EXPRESSION, CHANGE_EXPRESSION); _pageCursorPanel.setPageCursor(getResult().getQueryResult().getPageCursor()); } // properties ================================================================== public ManageMetadataController getMmController() { return mmController; } public void setMmController(ManageMetadataController mmController) { this.mmController = mmController; } /** * Gets harvest criteria. * * @return harvest criteria */ public HrCriteria getCriteria() { return getHarvestContext().getHarvestCriteria(); } /** * Sets harvest criteria. * * @param criteria harvest criteria */ public void setCriteria(HrCriteria criteria) { getHarvestContext().setHarvestCriteria(criteria); } /** * Gets harvest result. * * @return harvest result */ public HrResult getResult() { return _result; } /** * Sets harvest result. * * @param result harvest result */ public void setResult(HrResult result) { _result = result != null ? result : new HrResult(); } /** * Gets harvest history criteria. * * @return harvest history criteria */ public HeCriteria getHistoryCriteria() { return getHarvestContext().getHistoryCriteria(); } /** * Sets harvest history criteria. * * @param historyCriteria harvest history criteria */ public void setHistoryCriteria(HeCriteria historyCriteria) { getHarvestContext().setHistoryCriteria(historyCriteria); } /** * Gets harvest repository editor. * * @return harvest repository editor */ public HarvestEditor getEditor() { return _editor; } /** * Sets harvest repository editor. * * @param editor harvest repository editor */ public void setEditor(HarvestEditor editor) { _editor = editor != null ? editor : new HarvestEditor(new HrRecord()); } /** * Gets sort direction style map. * * @return sort direction style map */ public BaseSortDirectionStyleMap getSortDirectionStyleMap() { return _sortDirectionStyleMap; } /** * Gets sort direction style. * * @return sort direction style */ public SortDirectionStyle getSortDirectionStyle() { return getSortDirectionStyleMap().getStyle(); } /** * Sets sort direction style. * * @param style sort direction style */ public void setSortDirectionStyle(SortDirectionStyle style) { getSortDirectionStyleMap().setStyle(style); } /** * Gets always false. * * @return <code>false</code> */ public boolean getAlwaysFalse() { return false; } /** * Sets always false. * * @param ignored ignored parameter */ public void setAlwaysFalse(boolean ignored) { } /** * Gets selectable publishers. * * @return selectable publishers */ public SelectablePublishers getSelectablePublishers() { return _selectablePublishers; } // methods ===================================================================== /** * Called to handle list of repositories event. * <p/> * Reads sort columna and sort direction and stores within query criteria * object. * * @param event the associated JSF action event * @throws AbortProcessingException if processing should be aborted * @see HarvestContext */ public void handleListRepositories(ActionEvent event) throws AbortProcessingException { try { // start execution phase RequestContext context = onExecutionPhaseStarted(); // check authorization authorizeAction(context); // check for a page cursor navigation event getPageCursorPanel().checkActionEvent(event, true); // retrieve 'navMenuGlobal' flag from the request; only call from main menu // has this flag set UIComponent component = event.getComponent(); String sCommand = Val.chkStr((String) component.getAttributes().get("command")); if (sCommand.equalsIgnoreCase("sort")) { String sCol = (String) component.getAttributes().get("column"); String sDir = (String) component.getAttributes().get("defaultDirection"); String sCurrCol = getCriteria().getQueryCriteria().getSortOption().getColumnKey(); if (sCol.equalsIgnoreCase(sCurrCol)) { switch (SortOption.SortDirection.checkValue(sDir)) { case asc: sDir = SortOption.SortDirection.desc.name().toLowerCase(); break; case desc: sDir = SortOption.SortDirection.asc.name().toLowerCase(); break; } } getCriteria().getQueryCriteria(). getSortOption().setColumnKey(sCol, true, sDir); } // evaluate local id String sLocalId = getCriteria().getQueryCriteria().getLocalId(); if (sLocalId.length() > 0) { if (Val.chkInt(sLocalId, 0) <= 0) { if (isAdministrator(context)) { getCriteria().getQueryCriteria().setLocalId(""); } else { extractMessageBroker().addErrorMessage( "catalog.harvest.manage.message.err.idInv"); } } } } catch (AbortProcessingException e) { throw (e); } catch (Throwable t) { handleException(t); } finally { onExecutionPhaseCompleted(); } } /** * Handles repository creation. * * @param event the associated JSF action event * @throws AbortProcessingException if processing should be aborted */ public void handleCreateRepository(ActionEvent event) throws AbortProcessingException { try { // start execution phase RequestContext context = onExecutionPhaseStarted(); // check authorization authorizeAction(context); HrCriteria hc = getHarvestContext().getHarvestCriteria(); hc.getActionCriteria().setUuid(""); } catch (AbortProcessingException e) { throw (e); } catch (Throwable t) { handleException(t); } finally { onExecutionPhaseCompleted(); } } /** * Handles initiating incremental synchronization. * * @param event action event * @throws AbortProcessingException if processing has been aborted */ public void handleIncSynchronization(ActionEvent event) throws AbortProcessingException { // start execution phase RequestContext context = onExecutionPhaseStarted(); try { submitIncSynchronization(context); createEditor(context, true); } catch (Throwable t) { handleException(t); } finally { onExecutionPhaseCompleted(); } } /** * Handles initiating full synchronization. * * @param event action event * @throws AbortProcessingException if processing has been aborted */ public void handleFullSynchronization(ActionEvent event) throws AbortProcessingException { // start execution phase RequestContext context = onExecutionPhaseStarted(); try { submitFullSynchronization(context); createEditor(context, true); } catch (Throwable t) { handleException(t); } finally { onExecutionPhaseCompleted(); } } /** * Handles canceling synchronization. * * @param event action event * @throws AbortProcessingException if processing has been aborted */ public void handleCancelSynchronization(ActionEvent event) throws AbortProcessingException { // start execution phase RequestContext context = onExecutionPhaseStarted(); try { submitCancelSycnhronization(context); createEditor(context, true); } catch (Throwable t) { handleException(t); } finally { onExecutionPhaseCompleted(); } } public void handleUpdateRepositoryAndClose(ActionEvent event) throws AbortProcessingException { handleUpdateRepository(event); getMmController().processAction(event); } /** * Updates repository repository. * * @param event the associated JSF action event * @throws AbortProcessingException if processing should be aborted */ public void handleUpdateRepository(ActionEvent event) throws AbortProcessingException { // start execution phase RequestContext context = onExecutionPhaseStarted(); try { getEditor().setTimeCodes(_timeCodes); _timeCodes = ""; // copy ownership Publisher owner = getSelectablePublishers().selectedAsPublisher(context, true); if (owner != null) { getEditor().getRepository().setOwnerId(owner.getLocalID()); } getEditor().prepareForUpdate(); if (getEditor().validate(extractMessageBroker())) { HrCompleteUpdateRequest req = new HrCompleteUpdateRequest(context, getEditor().getRepository()); boolean creating = req.execute(); extractMessageBroker().addSuccessMessage( creating ? "catalog.harvest.manage.message.create.2" : "catalog.harvest.manage.message.update.2"); } } catch (ValidationException e) { String sKey = e.getKey(); if (sKey.length() > 0) { String sMsg = sKey; Schema schema = context.getCatalogConfiguration().getConfiguredSchemas().get(sKey); if (schema != null) { if (schema.getLabel() != null) { String sResKey = schema.getLabel().getResourceKey(); if (sResKey.length() > 0) { sMsg = extractMessageBroker().retrieveMessage(sResKey) + " (" + sKey + ")"; } } } FacesMessage fm = new FacesMessage(FacesMessage.SEVERITY_WARN, " - " + sMsg, null); extractMessageBroker().addMessage(fm); } e.getValidationErrors().buildMessages(extractMessageBroker(), true); } catch (HrAssertUrlException e) { extractMessageBroker().addErrorMessage("catalog.harvest.manage.message.err.duplicatedUrl"); } catch (TransformerException ex) { extractMessageBroker().addErrorMessage("catalog.harvest.manage.edit.err.notXml"); } catch (SAXException ex) { extractMessageBroker().addErrorMessage("catalog.harvest.manage.edit.err.invXml"); } catch (AbortProcessingException e) { throw (e); } catch (Throwable t) { handleException(t); } finally { onExecutionPhaseCompleted(); } } /** * Checks connection to the remote server. * * @param event the associated JSF action event * @throws AbortProcessingException if processing should be aborted */ public void handleTestConnection(ActionEvent event) throws AbortProcessingException { try { // start execution phase RequestContext context = onExecutionPhaseStarted(); // check authorization authorizeAction(context); // perform check through the validator HrRecord repository = getEditor().getRepository(); ValidatorFactory validatorFactory = ValidatorFactory.getInstance(); IValidator validator = validatorFactory.getValidator(repository); if (validator!=null && validator.checkConnection(new MessageCollectorAdaptor(extractMessageBroker()))) { extractMessageBroker().addSuccessMessage("catalog.harvest.manage.test.success"); } } catch (Throwable t) { handleException(t); } finally { onExecutionPhaseCompleted(); } } /** * Checks connection to the remote server. * * @param event the associated JSF action event * @throws AbortProcessingException if processing should be aborted * @deprecated identical to {@link #handleTestConnection} */ @Deprecated public void handleTestAgs2AgpConnection(ActionEvent event) throws AbortProcessingException { handleTestConnection(event); } /** * Tests agp-2-agp query. * @param event action event * @throws AbortProcessingException if processing should be aborted * @deprecated identical to {@link #handleTestConnection} */ @Deprecated public void handleTestAgp2AgpQuery(ActionEvent event) throws AbortProcessingException { handleTestConnection(event); } /** * Tests agp destination client. * @param event action event * @throws AbortProcessingException if processing should be aborted */ public void handleTestAgpDestination(ActionEvent event) throws AbortProcessingException { try { // start execution phase RequestContext context = onExecutionPhaseStarted(); // check authorization authorizeAction(context); // perform check through the validator HrRecord repository = getEditor().getRepository(); ValidatorFactory validatorFactory = ValidatorFactory.getInstance(); IValidator validator = validatorFactory.getValidator(repository); IConnectionChecker destinationChecker = validator.listConnectionCheckers().get("destination"); if (destinationChecker!=null && destinationChecker.checkConnection(new MessageCollectorAdaptor(extractMessageBroker()))) { extractMessageBroker().addSuccessMessage("catalog.harvest.manage.test.success"); } } catch (Throwable t) { handleException(t); } finally { onExecutionPhaseCompleted(); } } /** * Tests agp-2-agp destination client. * @param event action event * @throws AbortProcessingException if processing should be aborted * @deprecated replaced by {@link #handleTestAgpDestination} */ @Deprecated public void handleTestAgp2AgpClient(ActionEvent event) throws AbortProcessingException { handleTestAgpDestination(event); } /** * Tests agp-2-agp destination client. * @param event action event * @throws AbortProcessingException if processing should be aborted * @deprecated replaced by {@link #handleTestAgpDestination} */ @Deprecated public void handleTestAgs2AgpClient(ActionEvent event) throws AbortProcessingException { handleTestAgpDestination(event); } /** * <i>Execute</i> button action handler. * * @return navigation outcome */ public String onClickButtonExecuteAction() { try { // start execution phase RequestContext context = onExecutionPhaseStarted(); // check authorization authorizeAction(context); // get action HrActionCriteria.RepositoryAction action = getCriteria().getActionCriteria().getAction(); StringSet uuids = getCriteria().getActionCriteria().getSelectedRecordIdSet(); String[] aUuids = uuids.toArray(new String[uuids.size()]); switch (action) { case Create: getCriteria().getActionCriteria().setUuid(""); return "catalog.harvest.manage.create"; case Edit: if (aUuids.length == 1) { getCriteria().getActionCriteria().setUuid(aUuids[0]); return "catalog.harvest.manage.edit"; } else { extractMessageBroker().addErrorMessage( "catalog.harvest.manage.message.err.selection"); } break; case Delete: HrDeleteRequest request = new HrDeleteRequest(context, aUuids); request.execute(); int nRecordsDeleted = request.getActionResult().getNumberOfRecordsModified(); if (aUuids.length > 0) { extractMessageBroker().addSuccessMessage( "catalog.harvest.manage.message.deleted", new Object[]{ Integer.toString(nRecordsDeleted), Integer.toString(aUuids.length) }); } else { extractMessageBroker().addErrorMessage( "catalog.harvest.manage.message.err.atLeast"); } break; case History: if (aUuids.length == 1) { getHistoryCriteria().getActionCriteria().setUuid(aUuids[0]); return "catalog.harvest.manage.history"; } else { extractMessageBroker().addErrorMessage( "catalog.harvest.manage.message.err.selection"); } break; case Synchronize: submitIncSynchronization(context); break; case Cancel: submitCancelSycnhronization(context); break; } } catch (Throwable t) { handleException(t); } finally { onExecutionPhaseCompleted(); } return ""; } /** * Prepares page to display list of harvest repositories. * * @return empty string */ public String getListRepositoriesView() { try { // start view preparation phase RequestContext context = onPrepareViewStarted(); // check authorization authorizeAction(context); getResult().getQueryResult().getRecords().clear(); if (getCriteria().getActionCriteria().getAction() == HrActionCriteria.RepositoryAction.Unknown) { getCriteria().getActionCriteria(). setAction(HrActionCriteria.RepositoryAction.Create); } HrSelectRequest request = new HrSelectRequest(context, getCriteria(), getResult(), isAdministrator(context)); request.execute(); } catch (NotAuthorizedException e) { try { ExternalContext ec = getContextBroker().getExternalContext(); ec.redirect(Val.chkStr(ec.getRequestContextPath()) + "/catalog/main/home.page"); } catch (Throwable t) { getLogger().log(Level.SEVERE, "Exception raised.", t); } } catch (Throwable t) { handleException(t); } finally { onPrepareViewCompleted(); } return ""; } /** * Does post-preparation of the list of harvest repositories. * * @return empty string */ public String getListRepositoriesPostView() { // build the UI components associated with the PageCursorPanel getPageCursorPanel().setPageCursor( getResult().getQueryResult().getPageCursor()); return ""; } /** * Prepares page to display edited repository. * * @return empty string */ public String getEditRepositoryView() { try { // start view preparation phase RequestContext context = onPrepareViewStarted(); // check authorization authorizeAction(context); // create editor createEditor(context, false); } catch (NotAuthorizedException e) { try { ExternalContext ec = getContextBroker().getExternalContext(); ec.redirect(Val.chkStr(ec.getRequestContextPath()) + "/catalog/main/home.page"); } catch (Throwable t) { getLogger().log(Level.SEVERE, "Exception raised.", t); } } catch (Throwable t) { handleException(t); HrRecord record = new HrRecord(); record.setProtocol(new HarvestProtocolArcIms()); setEditor(new HarvestEditor(record)); } finally { onPrepareViewCompleted(); } return ""; } /** * Sets synchronization status. * * @param status synchronization status */ public void setSynchronizationStatus(String status) { this.synchronizationStatus = Val.chkStr(status, "none"); } /** * Gets synchronization status. * * @return synchronization status. */ public String getSynchronizationStatus() { return synchronizationStatus; } /** * Gets synchronization statistics. * * @return synchronization statistics */ public String getSynchronizationStatistics() { RequestContext context = onPrepareViewStarted(); try { HrRecord record = getEditor().getRepository(); if (record.getRecentJobStatus() == RecentJobStatus.Running) { Statistics stats = context.getApplicationContext().getHarvestingEngine().getStatistics(record.getUuid()); if (stats != null) { String[] params = new String[]{ Long.toString(stats.getHarvestedCount()), Long.toString(stats.getValidatedCount()), Long.toString(stats.getPublishedCount()), new TimePeriod(stats.getDuration()).toLocalizedString(extractMessageBroker()), Double.toString(stats.getPerformance()) }; return extractMessageBroker().retrieveMessage("catalog.harvest.manage.edit.syncRunningStats", params); } } return ""; } finally { context.onExecutionPhaseCompleted(); } } /** * Prepares selected publishers. * * @return empty string */ public String getPrepareSelectedPublishers() { try { // start view preparation phase RequestContext context = onPrepareViewStarted(); if (!_selectablePublishersBuild) { _selectablePublishers.build(context, isAdministrator(context)); // read owner distinguished name and select record owner if (getEditor() != null && getEditor().getRepository() != null) { // read owner distinguished name HrRecord record = getEditor().getRepository(); LocalDao localDao = new LocalDao(context); String uDN = localDao.readDN(record.getOwnerId()); if (uDN.length() == 0) { User u = context.getUser(); if (u != null) { uDN = u.getDistinguishedName(); } } // check if this user already exist on the list of selectable publishers if (uDN.length() > 0) { boolean bExist = false; for (SelectItem si : getSelectablePublishers().getItems()) { if (si.getValue().equals(uDN)) { bExist = true; break; } } // if does not exist, try to finf him and add to this list if (!bExist) { Users allSelectablePublishers = Publisher.buildSelectablePublishers(context, true); User owner = allSelectablePublishers.get(uDN); if (owner != null) { getSelectablePublishers().getItems().add( new SelectItem(owner.getKey(), owner.getName())); } } // at least, select it getSelectablePublishers().setSelectedKey(uDN); } } _selectablePublishersBuild = true; } } catch (Throwable t) { handleException(t); } finally { onPrepareViewCompleted(); } return encode(getSelectablePublishers()); } /** * Companion to {@link HarvestController#getPrepareSelectedPublishers} * * @param ignore ignored argument */ public void setPrepareSelectedPublishers(String ignore) { _selectablePublishers = decodeSelectablePublishers(ignore); _selectablePublishersBuild = true; } /** * Sets info enabled. * * @param enabled <code>true</code> to enabled info. */ public void setInfoEnabled(boolean enabled) { this.infoEnabled = enabled; } /** * Checks if info enabled. * * @return <code>true</code> if info enabled. */ public boolean getInfoEnabled() { return infoEnabled; } /** * Gets protocols eligible to choose. * * @return collection of protocols eligible to choose */ public ArrayList<SelectItem> getProtocols() { ArrayList<SelectItem> protocols = new ArrayList<SelectItem>(); MessageBroker msgBroker = getContextBroker().extractMessageBroker(); ApplicationContext appCtx = ApplicationContext.getInstance(); ApplicationConfiguration appCfg = appCtx.getConfiguration(); ProtocolFactories protocolFactories = appCfg.getProtocolFactories(); for (String key : protocolFactories.getKeys()) { ProtocolFactory pf = protocolFactories.get(key); if (pf instanceof AgpProtocolFactory && !AGSProcessorConfig.isAvailable()) { continue; } String resourceKey = protocolFactories.getResourceKey(key); SelectItem item = new SelectItem(key.toLowerCase(), msgBroker.retrieveMessage(resourceKey)); protocols.add(item); } return protocols; } /** * Gets time points. * * @return list of time points */ public ArrayList<TimePoint> getTimePoints() { MessageBroker broker = extractMessageBroker(); ArrayList<TimePoint> timePoints = new ArrayList<TimePoint>(); try { AdHocEventList adHocEventList = getEditor().getRepository().getAdHocEventList(); for (IAdHocEvent evt : adHocEventList) { String localizedCaption = evt.getLocalizedCaption(broker); TimePoint tp = new TimePoint(evt, localizedCaption); timePoints.add(tp); } } catch (ParseException ex) { } return timePoints; } public void setTimeMessages(String timeMessages) { // intentionally left empty } public String getTimeMessages() { MessageBroker broker = extractMessageBroker(); try { StringBuilder sb = new StringBuilder(); AdHocEventList adHocEventList = getEditor().getRepository().getAdHocEventList(); for (IAdHocEvent evt : adHocEventList) { String localizedCaption = evt.getLocalizedCaption(broker); if (sb.length() > 0) { sb.append("|"); } sb.append(localizedCaption); } return sb.toString(); } catch (ParseException ex) { return ""; } } /** * Gets time codes. * * @return time codes. */ public String getTimeCodes() { return getEditor().getTimeCodes(); } /** * Sets time codes. * * @param timeCodes time codes */ public void setTimeCodes(String timeCodes) { this._timeCodes = timeCodes; getEditor().setTimeCodes(timeCodes); } /** * Creates editor. * * @param context request context * @param reload <code>true</code> to reload repository * @throws SQLException if accessing database fails */ private void createEditor(RequestContext context, boolean reload) throws SQLException { HrCriteria hc = getHarvestContext().getHarvestCriteria(); String uuid = hc.getActionCriteria().getUuid(); HrRecord record = null; boolean doInit = false; boolean doClear = false; if (UuidUtil.isUuid(uuid)) { if (!getEditor().getRepository().getUuid().equals(uuid) || reload) { RequestContext rc = new FacesContextBroker().extractRequestContext(); HrSelectRequest request = new HrSelectRequest(rc, uuid); request.execute(); HrRecords records = request.getQueryResult().getRecords(); if (records.size() == 1) { record = records.get(0); doInit = true; } else { doClear = true; extractMessageBroker().addErrorMessage( "catalog.harvest.manage.message.err.missing"); } } } else { doClear = true; } if (record == null) { record = getEditor().getRepository(); if (record.getProtocol() == null || context.getApplicationConfiguration().getProtocolFactories().get(record.getProtocol().getKind()) == null) { record = new HrRecord(); record.setProtocol(new HarvestProtocolResource()); ProtocolInvoker.setUpdateContent(record.getProtocol(), true); ProtocolInvoker.setUpdateDefinition(record.getProtocol(), true); ProtocolInvoker.setAutoApprove(record.getProtocol(), true); record.setFindable(true); record.setSearchable(true); record.setSynchronizable(true); } } if (record.getRecentJobStatus() == RecentJobStatus.Submited) { setSynchronizationStatus("submited"); } else if (record.getRecentJobStatus() == RecentJobStatus.Running) { setSynchronizationStatus("running"); } else if (record.getRecentJobStatus() == RecentJobStatus.Canceled) { setSynchronizationStatus("canceled"); } else if (record.getHarvestFrequency() != HarvestFrequency.Skip && record.getHarvestFrequency() != HarvestFrequency.Once && ApprovalStatus.isPubliclyVisible(record.getApprovalStatus().name()) && record.getSynchronizable()) { setSynchronizationStatus("scheduled"); } else { setSynchronizationStatus("none"); } setInfoEnabled(UuidUtil.isUuid(record.getUuid()) && ApprovalStatus.isPubliclyVisible(record.getApprovalStatus().name()) && record.getSynchronizable()); HarvestEditor harvestEditor = new HarvestEditor(record); harvestEditor.prepareForEdit(); setEditor(harvestEditor); } /** * Submits incremental synchronization request. * * @param context request context * @throws Exception if performing operation fails */ private void submitIncSynchronization(RequestContext context) throws Exception { ArrayList<String> uuids = new ArrayList<String>(); String uuid = getEditor().getRepository().getUuid(); HrSelectRequest select = new HrSelectRequest(context, uuid); select.execute(); for (HrRecord r : select.getQueryResult().getRecords()) { if (UuidUtil.isUuid(r.getUuid())) { uuids.add(r.getUuid()); } } String[] aUuids = uuids.toArray(new String[uuids.size()]); HrHarvestRequest hrvNowRequest = new HrHarvestRequest(context, aUuids, HjRecord.JobType.Now, getCriteria(), getResult()); hrvNowRequest.execute(); if (hrvNowRequest.getActionResult().getNumberOfRecordsModified() > 0) { extractMessageBroker().addSuccessMessage( "catalog.harvest.manage.message.synchronized", new Object[]{Integer.toString(hrvNowRequest.getActionResult(). getNumberOfRecordsModified()) }); } else { extractMessageBroker().addSuccessMessage( "catalog.harvest.manage.message.synchronized.none"); } } /** * Submits full synchronization request. * * @param context request context * @throws Exception if performing operation fails */ private void submitFullSynchronization(RequestContext context) throws Exception { ArrayList<String> uuids = new ArrayList<String>(); String uuid = getEditor().getRepository().getUuid(); HrSelectRequest select = new HrSelectRequest(context, uuid); select.execute(); for (HrRecord r : select.getQueryResult().getRecords()) { if (UuidUtil.isUuid(r.getUuid())) { uuids.add(r.getUuid()); } } String[] aUuids = uuids.toArray(new String[uuids.size()]); HrHarvestRequest hrvFullRequest = new HrHarvestRequest(context, aUuids, HjRecord.JobType.Full, getCriteria(), getResult()); hrvFullRequest.execute(); if (hrvFullRequest.getActionResult().getNumberOfRecordsModified() > 0) { extractMessageBroker().addSuccessMessage( "catalog.harvest.manage.message.synchronized", new Object[]{Integer.toString(hrvFullRequest.getActionResult(). getNumberOfRecordsModified()) }); } else { extractMessageBroker().addSuccessMessage( "catalog.harvest.manage.message.synchronized.none"); } } /** * Submits cancel synchronization request. * * @param context request context * @throws Exception if performing operation fails */ private void submitCancelSycnhronization(RequestContext context) throws Exception { ArrayList<String> uuids = new ArrayList<String>(); String uuid = getEditor().getRepository().getUuid(); HrSelectRequest select = new HrSelectRequest(context, uuid); select.execute(); for (HrRecord r : select.getQueryResult().getRecords()) { if (UuidUtil.isUuid(r.getUuid())) { uuids.add(r.getUuid()); } } String[] aUuids = uuids.toArray(new String[uuids.size()]); int canceledCount = 0; for (String u : aUuids) { if (context.getApplicationContext().getHarvestingEngine().cancel(context, u)) { canceledCount++; } } extractMessageBroker().addSuccessMessage( "catalog.harvest.manage.message.canceled", new Object[]{Integer.toString(canceledCount)}); } /** * Checks if user is administrator. * * @param context request context * @return <code>true</code> if user is administrator */ private boolean isAdministrator(RequestContext context) { return context.getUser() != null && context.getUser().getAuthenticationStatus().getWasAuthenticated() && context.getUser().getAuthenticationStatus(). getAuthenticatedRoles().hasRole("gptAdministrator"); } /** * Encodes selected item. * * @param si selected item to encode * @return encoded selected item */ private String encode(SelectItem si) { return si.getLabel() + "\t" + si.getValue().toString(); } /** * Decodes selected item. * * @param siData selected item to decode * @return decoded selected item */ private SelectItem decodeSelectItem(String siData) { String[] elements = Val.chkStr(siData).split("\t"); return new SelectItem(elements.length > 1 ? elements[1] : "", elements.length > 0 ? elements[0] : ""); } /** * Encodes selectable publishers. * * @param sp selectable publishers to encode * @return encoded selected publishers */ private String encode(SelectablePublishers sp) { StringBuilder sb = new StringBuilder(); for (SelectItem si : sp.getItems()) { if (sb.length() > 0) { sb.append("\r\n"); } sb.append(encode(si)); } return sb.toString(); } /** * Decodes selectable publishers. * * @param spData selectable publishers to decode * @return decoded selectable publishers */ private SelectablePublishers decodeSelectablePublishers(String spData) { String[] elements = Val.chkStr(spData).split("\r\n"); SelectablePublishers sp = new SelectablePublishers(); for (String siData : elements) { sp.getItems().add(decodeSelectItem(siData)); } return sp; } // types ======================================================================= /** * Custom implementation of SortDirectionStyleMap. */ private class SortDirectionStyleMapImpl extends BaseSortDirectionStyleMap { /** * Gets sort option. * * @return sort option */ @Override public SortOption getSortOption() { return getCriteria().getQueryCriteria().getSortOption(); } } }