diff options
Diffstat (limited to 'org.eclipse.mylyn.reviews.edit')
-rw-r--r-- | org.eclipse.mylyn.reviews.edit/META-INF/MANIFEST.MF | 9 | ||||
-rw-r--r-- | org.eclipse.mylyn.reviews.edit/src/org/eclipse/mylyn/reviews/edit/ReviewsEditPluginActivator.java (renamed from org.eclipse.mylyn.reviews.edit/src/org/eclipse/mylyn/reviews/edit/ReviewsEditPlugin.java) | 6 | ||||
-rw-r--r-- | org.eclipse.mylyn.reviews.edit/src/org/eclipse/mylyn/reviews/edit/remote/AbstractRemoteEditFactoryProvider.java | 109 | ||||
-rw-r--r-- | org.eclipse.mylyn.reviews.edit/src/org/eclipse/mylyn/reviews/edit/remote/ReviewsRemoteEditFactoryProvider.java | 31 | ||||
-rw-r--r-- | org.eclipse.mylyn.reviews.edit/src/org/eclipse/mylyn/reviews/spi/edit/remote/AbstractRemoteEditFactoryProvider.java | 328 | ||||
-rw-r--r-- | org.eclipse.mylyn.reviews.edit/src/org/eclipse/mylyn/reviews/spi/edit/remote/review/ReviewsRemoteEditFactoryProvider.java | 75 |
6 files changed, 412 insertions, 146 deletions
diff --git a/org.eclipse.mylyn.reviews.edit/META-INF/MANIFEST.MF b/org.eclipse.mylyn.reviews.edit/META-INF/MANIFEST.MF index d2bbe4db3..83f8393cd 100644 --- a/org.eclipse.mylyn.reviews.edit/META-INF/MANIFEST.MF +++ b/org.eclipse.mylyn.reviews.edit/META-INF/MANIFEST.MF @@ -10,11 +10,14 @@ Require-Bundle: org.eclipse.core.runtime, org.eclipse.emf.ecore;bundle-version="2.5.0", org.eclipse.emf.ecore.xmi;bundle-version="2.5.0", org.eclipse.emf.edit;bundle-version="2.5.0", - org.eclipse.mylyn.reviews.core;bundle-version="2.0.0" + org.eclipse.mylyn.reviews.core;bundle-version="2.0.0", + org.eclipse.core.resources Bundle-ActivationPolicy: lazy Bundle-RequiredExecutionEnvironment: JavaSE-1.6 Bundle-Vendor: Eclipse Mylyn Export-Package: org.eclipse.mylyn.reviews.edit, org.eclipse.mylyn.reviews.edit.provider, - org.eclipse.mylyn.reviews.edit.remote -Bundle-Activator: org.eclipse.mylyn.reviews.edit.ReviewsEditPlugin + org.eclipse.mylyn.reviews.spi.edit.remote;x-friends:="org.eclipse.mylyn.reviews.ui", + org.eclipse.mylyn.reviews.spi.edit.remote.review;x-friends:="org.eclipse.mylyn.reviews.ui" +Bundle-Activator: org.eclipse.mylyn.reviews.edit.ReviewsEditPluginActivator +Import-Package: org.apache.commons.io diff --git a/org.eclipse.mylyn.reviews.edit/src/org/eclipse/mylyn/reviews/edit/ReviewsEditPlugin.java b/org.eclipse.mylyn.reviews.edit/src/org/eclipse/mylyn/reviews/edit/ReviewsEditPluginActivator.java index db2215b12..fbc67cfea 100644 --- a/org.eclipse.mylyn.reviews.edit/src/org/eclipse/mylyn/reviews/edit/ReviewsEditPlugin.java +++ b/org.eclipse.mylyn.reviews.edit/src/org/eclipse/mylyn/reviews/edit/ReviewsEditPluginActivator.java @@ -14,11 +14,11 @@ package org.eclipse.mylyn.reviews.edit; import org.osgi.framework.BundleActivator; import org.osgi.framework.BundleContext; -public class ReviewsEditPlugin implements BundleActivator { +public class ReviewsEditPluginActivator implements BundleActivator { public static final String PLUGIN_ID = "org.eclipse.mylyn.reviews.edit"; //$NON-NLS-1$ - private static ReviewsEditPlugin plugin; + private static ReviewsEditPluginActivator plugin; public void start(BundleContext context) throws Exception { plugin = this; @@ -28,7 +28,7 @@ public class ReviewsEditPlugin implements BundleActivator { plugin = null; } - public static ReviewsEditPlugin getDefault() { + public static ReviewsEditPluginActivator getDefault() { return plugin; } } diff --git a/org.eclipse.mylyn.reviews.edit/src/org/eclipse/mylyn/reviews/edit/remote/AbstractRemoteEditFactoryProvider.java b/org.eclipse.mylyn.reviews.edit/src/org/eclipse/mylyn/reviews/edit/remote/AbstractRemoteEditFactoryProvider.java deleted file mode 100644 index b4f74978c..000000000 --- a/org.eclipse.mylyn.reviews.edit/src/org/eclipse/mylyn/reviews/edit/remote/AbstractRemoteEditFactoryProvider.java +++ /dev/null @@ -1,109 +0,0 @@ -/******************************************************************************* - * Copyright (c) 2013 Ericsson and others. - * 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: - * Miles Parker (Tasktop Technologies) - initial API and implementation - *******************************************************************************/ - -package org.eclipse.mylyn.reviews.edit.remote; - -import java.util.HashMap; - -import org.eclipse.core.runtime.IStatus; -import org.eclipse.core.runtime.Status; -import org.eclipse.emf.common.command.AbstractCommand; -import org.eclipse.emf.common.command.BasicCommandStack; -import org.eclipse.emf.ecore.EClass; -import org.eclipse.emf.ecore.EFactory; -import org.eclipse.emf.ecore.EObject; -import org.eclipse.emf.ecore.resource.Resource; -import org.eclipse.emf.ecore.resource.impl.ResourceImpl; -import org.eclipse.emf.edit.domain.AdapterFactoryEditingDomain; -import org.eclipse.emf.edit.domain.EditingDomain; -import org.eclipse.emf.edit.provider.ComposedAdapterFactory; -import org.eclipse.emf.edit.provider.resource.ResourceItemProviderAdapterFactory; -import org.eclipse.mylyn.commons.core.StatusHandler; -import org.eclipse.mylyn.reviews.core.model.IRepository; -import org.eclipse.mylyn.reviews.core.spi.remote.AbstractRemoteFactoryProvider; -import org.eclipse.mylyn.reviews.edit.ReviewsEditPlugin; -import org.eclipse.mylyn.reviews.edit.provider.ReviewsItemProviderAdapterFactory; - -/** - * Supports decoupling of Reviews from remote API as well as job management. - * - * @author Miles Parker - */ -public abstract class AbstractRemoteEditFactoryProvider<ERootObject extends EObject> extends - AbstractRemoteFactoryProvider { - - private final EditingDomain editingDomain; - - ERootObject rootObject; - - public AbstractRemoteEditFactoryProvider(EFactory emfFactory, EClass rootClass) { - ComposedAdapterFactory adapterFactory = new ComposedAdapterFactory( - ComposedAdapterFactory.Descriptor.Registry.INSTANCE); - - adapterFactory.addAdapterFactory(new ResourceItemProviderAdapterFactory()); - adapterFactory.addAdapterFactory(new ReviewsItemProviderAdapterFactory()); - - BasicCommandStack commandStack = new BasicCommandStack(); - editingDomain = new AdapterFactoryEditingDomain(adapterFactory, commandStack, new HashMap<Resource, Boolean>()); - - Resource resource = new ResourceImpl(); - - if (resource.getContents().size() > 0 && resource.getContents().get(0) instanceof IRepository) { - try { - rootObject = (ERootObject) resource.getContents().get(0); - } catch (ClassCastException e) { - StatusHandler.log(new Status(IStatus.ERROR, ReviewsEditPlugin.PLUGIN_ID, - "Problem creating editing domain. Unexpected root model content.", e)); - } - - } else { - try { - rootObject = (ERootObject) emfFactory.create(rootClass); - resource.getContents().add(rootObject); - } catch (ClassCastException e) { - StatusHandler.log(new Status(IStatus.ERROR, ReviewsEditPlugin.PLUGIN_ID, - "Problem creating editing domain. Root remote class must match remote editing domain type.", e)); - } - } - } - - @Override - public void modelExec(final Runnable runnable, boolean block) { - super.modelExec(new Runnable() { //Run in UI thread - public void run() { - editingDomain.getCommandStack().execute(new AbstractCommand() { - - public void redo() { - // noop - } - - public void execute() { - runnable.run(); - } - - @Override - protected boolean prepare() { - return true; - } - - @Override - public boolean canUndo() { - return false; - } - }); - } - }, block); - } - - public ERootObject getRoot() { - return rootObject; - } -} diff --git a/org.eclipse.mylyn.reviews.edit/src/org/eclipse/mylyn/reviews/edit/remote/ReviewsRemoteEditFactoryProvider.java b/org.eclipse.mylyn.reviews.edit/src/org/eclipse/mylyn/reviews/edit/remote/ReviewsRemoteEditFactoryProvider.java deleted file mode 100644 index a4974b9f9..000000000 --- a/org.eclipse.mylyn.reviews.edit/src/org/eclipse/mylyn/reviews/edit/remote/ReviewsRemoteEditFactoryProvider.java +++ /dev/null @@ -1,31 +0,0 @@ -/******************************************************************************* - * Copyright (c) 2013 Ericsson and others. - * 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: - * Miles Parker (Tasktop Technologies) - initial API and implementation - *******************************************************************************/ - -package org.eclipse.mylyn.reviews.edit.remote; - -import org.eclipse.emf.ecore.EFactory; -import org.eclipse.mylyn.reviews.core.model.IRepository; -import org.eclipse.mylyn.reviews.core.model.IReviewsFactory; -import org.eclipse.mylyn.reviews.core.spi.remote.review.IReviewRemoteFactoryProvider; -import org.eclipse.mylyn.reviews.internal.core.model.ReviewsPackage; - -/** - * Supports decoupling of Reviews from remote API as well as job management. - * - * @author Miles Parker - */ -public abstract class ReviewsRemoteEditFactoryProvider extends AbstractRemoteEditFactoryProvider<IRepository> implements - IReviewRemoteFactoryProvider { - - public ReviewsRemoteEditFactoryProvider() { - super((EFactory) IReviewsFactory.INSTANCE, ReviewsPackage.Literals.REPOSITORY); - } -} diff --git a/org.eclipse.mylyn.reviews.edit/src/org/eclipse/mylyn/reviews/spi/edit/remote/AbstractRemoteEditFactoryProvider.java b/org.eclipse.mylyn.reviews.edit/src/org/eclipse/mylyn/reviews/spi/edit/remote/AbstractRemoteEditFactoryProvider.java new file mode 100644 index 000000000..185a71a17 --- /dev/null +++ b/org.eclipse.mylyn.reviews.edit/src/org/eclipse/mylyn/reviews/spi/edit/remote/AbstractRemoteEditFactoryProvider.java @@ -0,0 +1,328 @@ +/******************************************************************************* + * Copyright (c) 2013 Ericsson and others. + * 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: + * Miles Parker (Tasktop Technologies) - initial API and implementation + *******************************************************************************/ + +package org.eclipse.mylyn.reviews.spi.edit.remote; + +import java.io.File; +import java.io.IOException; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +import org.apache.commons.io.FileUtils; +import org.eclipse.core.runtime.IPath; +import org.eclipse.core.runtime.IStatus; +import org.eclipse.core.runtime.Path; +import org.eclipse.core.runtime.Status; +import org.eclipse.emf.common.command.AbstractCommand; +import org.eclipse.emf.common.command.BasicCommandStack; +import org.eclipse.emf.common.util.URI; +import org.eclipse.emf.ecore.EAttribute; +import org.eclipse.emf.ecore.EClass; +import org.eclipse.emf.ecore.EClassifier; +import org.eclipse.emf.ecore.EFactory; +import org.eclipse.emf.ecore.EObject; +import org.eclipse.emf.ecore.EReference; +import org.eclipse.emf.ecore.resource.Resource; +import org.eclipse.emf.ecore.xmi.XMLResource; +import org.eclipse.emf.edit.domain.AdapterFactoryEditingDomain; +import org.eclipse.emf.edit.domain.EditingDomain; +import org.eclipse.emf.edit.provider.ComposedAdapterFactory; +import org.eclipse.emf.edit.provider.resource.ResourceItemProviderAdapterFactory; +import org.eclipse.mylyn.commons.core.StatusHandler; +import org.eclipse.mylyn.reviews.core.spi.remote.AbstractDataLocator; +import org.eclipse.mylyn.reviews.core.spi.remote.emf.AbstractRemoteEmfFactoryProvider; +import org.eclipse.mylyn.reviews.edit.ReviewsEditPluginActivator; +import org.eclipse.mylyn.reviews.edit.provider.ReviewsItemProviderAdapterFactory; + +/** + * Supports decoupling of Reviews from remote API as well as job management. + * + * @author Miles Parker + */ +public abstract class AbstractRemoteEditFactoryProvider<ERootObject extends EObject, EChildObject extends EObject> + extends AbstractRemoteEmfFactoryProvider<ERootObject, EChildObject> { + + private static final String DIRECTORY_METADATA = ".metadata"; //$NON-NLS-1$ + + private static final String NAME_DATA_DIR = ".mylyn"; //$NON-NLS-1$ + + final EditingDomain editingDomain; + + ERootObject rootObject; + + private final EFactory emfFactory; + + private final EReference parentReference; + + private final EAttribute localKeyAttribute; + + private final EClass childType; + + public AbstractRemoteEditFactoryProvider(final EFactory emfFactory, EReference parentReference, + final EAttribute localKeyAttribute, EClass childType) { + this.emfFactory = emfFactory; + this.parentReference = parentReference; + this.localKeyAttribute = localKeyAttribute; + this.childType = childType; + ComposedAdapterFactory adapterFactory = new ComposedAdapterFactory( + ComposedAdapterFactory.Descriptor.Registry.INSTANCE); + + adapterFactory.addAdapterFactory(new ResourceItemProviderAdapterFactory()); + adapterFactory.addAdapterFactory(new ReviewsItemProviderAdapterFactory()); + + BasicCommandStack commandStack = new BasicCommandStack(); + editingDomain = new AdapterFactoryEditingDomain(adapterFactory, commandStack, new HashMap<Resource, Boolean>()); + + Map<Object, Object> loadOptions = editingDomain.getResourceSet().getLoadOptions(); + loadOptions.put(XMLResource.OPTION_DEFER_ATTACHMENT, Boolean.TRUE); + loadOptions.put(XMLResource.OPTION_DEFER_IDREF_RESOLUTION, Boolean.TRUE); + loadOptions.put(XMLResource.OPTION_USE_DEPRECATED_METHODS, Boolean.TRUE); + loadOptions.put(XMLResource.OPTION_ENCODING, "UTF-8"); //$NON-NLS-1$ + } + + public EClass getRootClass() { + return parentReference.getEContainingClass(); + } + + @Override + public ERootObject open() { + if (rootObject == null) { + rootObject = (ERootObject) open(getRootClass(), getRootClass().getName()); + clearChildren(); + } + return rootObject; + } + + @Override + public EChildObject open(Object id) { + getService().ensureModelThread(); + Object parentList = getRoot().eGet(parentReference); + if (parentList instanceof List<?>) { + List<?> members = (List<?>) parentList; + for (Object object : members) { + Object localKey = ((EObject) object).eGet(localKeyAttribute); + if (localKey != null && localKey.equals(id)) { + return (EChildObject) object; + } + } + } + EChildObject child = (EChildObject) open(childType, (String) id); + if (child != null) { + ((List) getRoot().eGet(parentReference)).add(child); + } + return child; + } + + private Resource getResourceImpl(URI uri, boolean loadOnDemand) { + Resource resource = null; + String fileString = uri.devicePath(); + IPath filePath = new Path(fileString); + File file = new File(filePath.toOSString()); + if (!file.exists()) { + File dir = new File(new Path(fileString).removeFileExtension().removeLastSegments(1).toOSString()); + if (!dir.exists()) { + dir.mkdirs(); + } + resource = editingDomain.getResourceSet().createResource(uri); + save(resource); + } + + try { + resource = editingDomain.getResourceSet().getResource(uri, loadOnDemand); + } catch (Exception e) { + //If anything else goes wrong, just delete and recreate the file anyway! + StatusHandler.log(new Status(IStatus.ERROR, ReviewsEditPluginActivator.PLUGIN_ID, + "Problem with model file. Will be recreated at: " + uri, e)); + file.delete(); + resource = editingDomain.getResourceSet().getResource(uri, loadOnDemand); + } + + String className = getDataLocator().parseFileType(filePath); + EClass eClass = null; + for (EClassifier classifier : emfFactory.getEPackage().getEClassifiers()) { + if (className.equals(classifier.getName())) { + eClass = (EClass) classifier; + break; + } + } + if (eClass == null) { + throw new RuntimeException("No instances of " + className + " found in " + + emfFactory.getEPackage().getEClassifiers()); + } + + if (resource.getContents().size() > 0) { + Object object = resource.getContents().get(0); + if (!eClass.isInstance(object)) { + resource.getContents().clear(); + } + } + if (resource.getContents().size() == 0) { + try { + EChildObject object = (EChildObject) emfFactory.create(eClass); + String id = getDataLocator().parseFileName(filePath); + if (object.eClass().getEAllAttributes().contains(localKeyAttribute)) { + object.eSet(localKeyAttribute, id); + } + resource.getContents().add(object); + save(resource); + } catch (AssertionError e) { + StatusHandler.log(new Status(IStatus.ERROR, ReviewsEditPluginActivator.PLUGIN_ID, + "Bad provider defintion. Local key attribute must be reference of class child type. Local Key: " + + localKeyAttribute.getName() + " Class: " + eClass.getName(), e)); + } catch (ClassCastException e) { + StatusHandler.log(new Status(IStatus.ERROR, ReviewsEditPluginActivator.PLUGIN_ID, + "Bad provider definition. Root remote refernce must match child type.", e)); + } + } + + return resource; + } + + protected EObject open(EClass eClass, String id) { + String containerSegment = getContainerSegment(); + URI uri = URI.createFileURI(getDataLocator().getFilePath(containerSegment, eClass.getName(), id, + getFileExtension(parentReference.getEContainingClass())).toOSString()); + Resource resource = getResourceImpl(uri, true); + return resource.getContents().get(0); + } + + public String getContainerSegment() { + return parentReference.getContainerClass().getName(); + } + + public String getScalablePath(String id) { + return id; + } + + public abstract String getFileExtension(EClass eClass); + + public Resource recreateResource(URI fileUri) { + return editingDomain.getResourceSet().createResource(fileUri); + } + + @Override + public void close(EObject child) { + getService().ensureModelThread(); + if (child == null) { + return; + } + save(child); + Object parentList = getRoot().eGet(parentReference); + if (parentList instanceof List<?>) { + List<?> members = (List<?>) parentList; + members.remove(child); + } + Resource resource = child.eResource(); + if (resource != null) { + resource.getResourceSet().getResources().remove(resource); + resource.unload(); + } + } + + private void clearChildren() { + //We must allow this to occur outside of model thread for case of workbench shutdown + if (getRoot() != null) { + Object parentList = getRoot().eGet(parentReference); + if (parentList instanceof List<?>) { + List<?> members = (List<?>) parentList; + members.clear(); + } + } + } + + @Override + public void close() { + clearChildren(); + save(); + rootObject = null; + } + + public void save(EObject object) { + if (object != null) { + save(object.eResource()); + } + } + + public void save() { + save(getRoot()); + } + + public void save(Resource resource) { + if (resource == null) { + return; + } + final Map<Object, Object> saveOptions = new HashMap<Object, Object>(); + saveOptions.put(Resource.OPTION_SAVE_ONLY_IF_CHANGED, Resource.OPTION_SAVE_ONLY_IF_CHANGED_MEMORY_BUFFER); + if (resource instanceof XMLResource) { + saveOptions.put(XMLResource.OPTION_ENCODING, "UTF-8"); //$NON-NLS-1$ + } + try { + resource.save(saveOptions); + } catch (IOException e) { + StatusHandler.log(new Status(IStatus.ERROR, ReviewsEditPluginActivator.PLUGIN_ID, "Couldn't save model.", e)); + } + } + + /** + * WARNING: Recursively deletes directory specified by {@link AbstractDataLocator#getSystemPath()}. Ensure that that + * directory isn't used by any other resources! + */ + public void deleteCache() { + close(); + IPath systemPath = getDataLocator().getSystemPath(); + File file = new File(systemPath.toOSString()); + if (file.exists()) { + try { + FileUtils.deleteDirectory(file); + } catch (IOException e) { + StatusHandler.log(new Status(IStatus.ERROR, ReviewsEditPluginActivator.PLUGIN_ID, + "Problem when deleting cache.", e)); + } + } + } + + @Override + public void modelExec(final Runnable runnable, boolean block) { + super.modelExec(new Runnable() { //Run in UI thread + public void run() { + editingDomain.getCommandStack().execute(new AbstractCommand() { + + public void redo() { + // noop + } + + public void execute() { + runnable.run(); + } + + @Override + protected boolean prepare() { + return true; + } + + @Override + public boolean canUndo() { + return false; + } + }); + } + }, block); + } + + public ERootObject getRoot() { + return rootObject; + } + + public EditingDomain getEditingDomain() { + return editingDomain; + } +} diff --git a/org.eclipse.mylyn.reviews.edit/src/org/eclipse/mylyn/reviews/spi/edit/remote/review/ReviewsRemoteEditFactoryProvider.java b/org.eclipse.mylyn.reviews.edit/src/org/eclipse/mylyn/reviews/spi/edit/remote/review/ReviewsRemoteEditFactoryProvider.java new file mode 100644 index 000000000..a8c83f3db --- /dev/null +++ b/org.eclipse.mylyn.reviews.edit/src/org/eclipse/mylyn/reviews/spi/edit/remote/review/ReviewsRemoteEditFactoryProvider.java @@ -0,0 +1,75 @@ +/******************************************************************************* + * Copyright (c) 2013 Ericsson and others. + * 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: + * Miles Parker (Tasktop Technologies) - initial API and implementation + *******************************************************************************/ + +package org.eclipse.mylyn.reviews.spi.edit.remote.review; + +import java.net.MalformedURLException; +import java.net.URL; + +import org.eclipse.core.runtime.IStatus; +import org.eclipse.emf.ecore.EClass; +import org.eclipse.emf.ecore.EFactory; +import org.eclipse.mylyn.reviews.core.model.IRepository; +import org.eclipse.mylyn.reviews.core.model.IReview; +import org.eclipse.mylyn.reviews.core.model.IReviewsFactory; +import org.eclipse.mylyn.reviews.core.spi.remote.review.IReviewRemoteFactoryProvider; +import org.eclipse.mylyn.reviews.edit.ReviewsEditPluginActivator; +import org.eclipse.mylyn.reviews.internal.core.model.ReviewsPackage; +import org.eclipse.mylyn.reviews.spi.edit.remote.AbstractRemoteEditFactoryProvider; +import org.eclipse.mylyn.tasks.core.RepositoryStatus; +import org.eclipse.mylyn.tasks.core.TaskRepository; + +/** + * Supports decoupling of Reviews from remote API as well as job management. + * + * @author Miles Parker + */ +public abstract class ReviewsRemoteEditFactoryProvider extends AbstractRemoteEditFactoryProvider<IRepository, IReview> + implements IReviewRemoteFactoryProvider { + + private final TaskRepository taskRepository; + + public ReviewsRemoteEditFactoryProvider(TaskRepository repository) { + super((EFactory) IReviewsFactory.INSTANCE, ReviewsPackage.Literals.REPOSITORY__REVIEWS, + ReviewsPackage.Literals.CHANGE__ID, ReviewsPackage.Literals.REVIEW); + this.taskRepository = repository; + } + + @Override + public IRepository open() { + IRepository modelRepository = super.open(); + modelRepository.setTaskRepository(taskRepository); + modelRepository.setTaskRepositoryUrl(taskRepository.getUrl()); + modelRepository.setTaskConnectorKind(taskRepository.getConnectorKind()); + return modelRepository; + } + + @Override + public String getContainerSegment() { + try { + return taskRepository.getConnectorKind() + "-" + asFileName(taskRepository.getUrl()); + } catch (MalformedURLException e) { + RepositoryStatus.createStatus(taskRepository, IStatus.ERROR, ReviewsEditPluginActivator.PLUGIN_ID, + "Bad repository url: " + taskRepository.getUrl()); + return "BadRepository"; + } + } + + public static String asFileName(String urlString) throws MalformedURLException { + URL url = new URL(urlString); + return url.getProtocol() + "-" + url.getHost() + "-" + url.getPath().replaceAll("/", "-"); + } + + @Override + public String getFileExtension(EClass eClass) { + return "reviews"; + } +} |