/******************************************************************************* * Copyright (c) 2008 Pierre-Antoine Grégoire. * All rights reserved. This program and the accompanying materials * are made available under the terms of the Eclipse Public License v1.0 * which accompanies this distribution, and is available at * http://www.eclipse.org/legal/epl-v10.html * * Contributors: * Pierre-Antoine Grégoire - initial API and implementation *******************************************************************************/ package org.org.eclipse.dws.core.internal.jobs; import org.apache.log4j.Logger; import org.eclipse.core.runtime.IProgressMonitor; import org.eclipse.core.runtime.IStatus; import org.eclipse.core.runtime.jobs.Job; import org.org.eclipse.core.utils.platform.jobs.BatchSimilarRule; import org.org.eclipse.core.utils.platform.wizards.StatusInfo; import org.org.eclipse.dws.core.DWSCorePlugin; import org.org.eclipse.dws.core.internal.bridges.RepositoryModelPersistence; import org.org.eclipse.dws.core.internal.model.ModelConstants; import org.org.model.IModelItemListener; import org.org.model.ModelItemEvent; import org.org.model.RootModelItem; import org.org.repository.crawler.IExternalInterruptionFlagSetter; import org.org.repository.crawler.InterruptionFlag; import org.org.repository.crawler.items.IFileSystemCrawledRepositorySetup; import org.org.repository.crawler.items.IHttpCrawledRepositorySetup; import org.org.repository.crawler.maven2.model.CrawledRepository; /** * The Class AddRepositoryJob. */ public final class AddRepositoryJob extends Job { /** * The Class JobUIlInterruptionFlagSetter. */ private static class JobUIlInterruptionFlagSetter implements IExternalInterruptionFlagSetter { /** The monitor. */ final IProgressMonitor monitor; /** * Instantiates a new job u il interruption flag setter. * * @param monitor * the monitor */ private JobUIlInterruptionFlagSetter(IProgressMonitor monitor) { super(); this.monitor = monitor; } /* * (non-Javadoc) * * @see org.org.repository.crawler.IExternalInterruptionFlagSetter#processStatus() */ /** * @see org.org.repository.crawler.IExternalInterruptionFlagSetter#processStatus() */ public InterruptionFlag processStatus() { InterruptionFlag flag = new InterruptionFlag(); if (monitor.isCanceled()) { flag.setCurrentStatus(InterruptionFlag.STOP); } return flag; } } /** * The listener interface for receiving newRepositoryMonitoring events. The class that is interested in processing a newRepositoryMonitoring event implements this interface, and the object created with that class is registered with a component using the component's <code>addNewRepositoryMonitoringListener<code> method. When * the newRepositoryMonitoring event occurs, that object's appropriate * method is invoked. * * @see NewRepositoryMonitoringEvent */ private static class NewRepositoryMonitoringListener implements IModelItemListener { /** The monitor. */ final IProgressMonitor monitor; /** * Instantiates a new new crawledRepository monitoring listener. * * @param monitor * the monitor */ private NewRepositoryMonitoringListener(IProgressMonitor monitor) { super(); this.monitor = monitor; } /* * (non-Javadoc) * * @see org.org.model.IModelItemListener#changeOccured(org.org.model.ModelItemEvent) */ /** * @see org.org.model.IModelItemListener#changeOccured(org.org.model.ModelItemEvent) */ public void changeOccured(ModelItemEvent modelItemEvent) { if (modelItemEvent.getEventType() == ModelItemEvent.EventType.PRE_ADD_CHILD) { monitor.subTask("Adding " + modelItemEvent.getTargetItem().getUID() + " to " + modelItemEvent.getSourceItem().getUID()); monitor.worked(1); DWSCorePlugin.getDefault().notifyRepositoryModelUpdate(modelItemEvent.getTargetItem()); } } } /** The logger. */ private Logger logger = Logger.getLogger(AddRepositoryJob.class); /** The crawledRepository. */ private final CrawledRepository crawledRepository; /** The Constant JOB_ID. */ private static final String JOB_ID = "DWS : Adding Maven 2 crawledRepository "; /** * Instantiates a new adds the crawledRepository job. * * @param crawledRepository * the crawledRepository */ public AddRepositoryJob(CrawledRepository crawledRepository) { super(JOB_ID + crawledRepository.getUID()); this.crawledRepository = crawledRepository; this.setPriority(Job.LONG); this.setUser(true); this.setRule(new BatchSimilarRule(Maven2Jobs.MAVEN2_REFRESH_JOB_FAMILY)); } /* * (non-Javadoc) * * @see org.eclipse.core.runtime.jobs.Job#run(org.eclipse.core.runtime.IProgressMonitor) */ /** * @see org.eclipse.core.runtime.jobs.Job#run(org.eclipse.core.runtime.IProgressMonitor) */ @Override public IStatus run(IProgressMonitor monitor) { StatusInfo result = new StatusInfo(IStatus.OK, "New crawledRepository browsed successfully."); try { if (this.crawledRepository.getRepositorySetup() instanceof IHttpCrawledRepositorySetup) { IHttpCrawledRepositorySetup httpCrawledRepositorySetup = (IHttpCrawledRepositorySetup) crawledRepository.getRepositorySetup(); RepositoryModelPersistence.addRepositoryNameAutocompleteProposal(this.crawledRepository.getLabel()); RepositoryModelPersistence.addHttpBrowsedRepositoryAutocompleteProposal(httpCrawledRepositorySetup.getBaseUrl()); if (httpCrawledRepositorySetup.getPatternSet().getEntryPattern() != null) { RepositoryModelPersistence.addEntryPatternAutocompleteProposal(httpCrawledRepositorySetup.getPatternSet().getEntryPattern()); } if (httpCrawledRepositorySetup.getPatternSet().getParentDirectoryPattern() != null) { RepositoryModelPersistence.addParentPatternAutocompleteProposal(httpCrawledRepositorySetup.getPatternSet().getParentDirectoryPattern()); } if (httpCrawledRepositorySetup.getProxyHost() != null) { RepositoryModelPersistence.addProxyHostAutocompleteProposal(httpCrawledRepositorySetup.getProxyHost()); } if (httpCrawledRepositorySetup.getProxyPort() != null && httpCrawledRepositorySetup.getProxyPort() != 0) { RepositoryModelPersistence.addProxyPortAutocompleteProposal("" + httpCrawledRepositorySetup.getProxyPort()); } } else if (this.crawledRepository.getRepositorySetup() instanceof IFileSystemCrawledRepositorySetup) { IFileSystemCrawledRepositorySetup fileSystemCrawledRepositorySetup = (IFileSystemCrawledRepositorySetup) crawledRepository.getRepositorySetup(); RepositoryModelPersistence.addRepositoryNameAutocompleteProposal(fileSystemCrawledRepositorySetup.getId()); RepositoryModelPersistence.addFSRepositoryAutocompleteProposal(fileSystemCrawledRepositorySetup.getBasePath()); } monitor.beginTask("Retrieving ...", 1000); IModelItemListener modelItemListener = new NewRepositoryMonitoringListener(monitor); RootModelItem<CrawledRepository> rootModelItem = RootModelItem.<CrawledRepository> getInstance(ModelConstants.REPOSITORIES_ROOT); rootModelItem.addChild(this.crawledRepository); IExternalInterruptionFlagSetter externalInterruptionFlagSetter = new JobUIlInterruptionFlagSetter(monitor); RepositoryModelPersistence.refreshRepository(this.crawledRepository, externalInterruptionFlagSetter, modelItemListener); RepositoryModelPersistence.saveRepositoryInfo(); DWSCorePlugin.getDefault().notifyRepositoryModelUpdate(rootModelItem); if (monitor.isCanceled()) { result = new StatusInfo(IStatus.WARNING, "CrawledRepository browsing was canceled, it may not be complete."); } } catch (Exception e) { logger.error(e.getMessage()); monitor.setCanceled(true); result = new StatusInfo(IStatus.ERROR, "CrawledRepository browsing error: " + e.getMessage()); } finally { monitor.done(); } return result; } /* * (non-Javadoc) * * @see org.eclipse.core.runtime.jobs.Job#belongsTo(java.lang.Object) */ /** * @see org.eclipse.core.runtime.jobs.Job#belongsTo(java.lang.Object) */ @Override public boolean belongsTo(Object family) { return Maven2Jobs.MAVEN2_REFRESH_JOB_FAMILY.equals(family); } }