| /******************************************************************************* |
| * Copyright (c) 2010, 2012 Ericsson AB 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: |
| * Ericsson AB - Intial Implementation |
| *******************************************************************************/ |
| |
| package org.eclipse.mylyn.reviews.r4e.internal.transform.serial.impl; |
| |
| import java.io.File; |
| import java.io.IOException; |
| import java.util.ArrayList; |
| import java.util.List; |
| import java.util.regex.Matcher; |
| import java.util.regex.Pattern; |
| |
| import org.eclipse.emf.common.util.EList; |
| import org.eclipse.emf.common.util.URI; |
| import org.eclipse.emf.ecore.EObject; |
| import org.eclipse.emf.ecore.resource.Resource; |
| import org.eclipse.emf.ecore.resource.ResourceSet; |
| import org.eclipse.mylyn.reviews.r4e.core.model.serial.IModelReader; |
| import org.eclipse.mylyn.reviews.r4e.core.model.serial.IRWUserBasedRes; |
| import org.eclipse.mylyn.reviews.r4e.core.model.serial.impl.R4EReader; |
| import org.eclipse.mylyn.reviews.r4e.core.model.serial.impl.ResourceHandlingException; |
| |
| /** |
| * @author Alvaro Sanchez-Leon |
| */ |
| public class TResReader extends R4EReader implements IModelReader { |
| |
| // ------------------------------------------------------------------------ |
| // Methods |
| // ------------------------------------------------------------------------ |
| |
| /* (non-Javadoc) |
| * @see org.eclipse.mylyn.reviews.r4e.core.model.serial.impl.IModelReader#deserializeTopElement(org.eclipse.emf.common.util.URI, org.eclipse.emf.ecore.resource.ResourceSet, java.lang.Class) |
| */ |
| @Override |
| public <T> T deserializeTopElement(URI aRootPath, ResourceSet resSet, Class<T> type) |
| throws ResourceHandlingException { |
| if (aRootPath == null) { |
| return null; |
| } |
| |
| EList<EObject> eObjects = getObjects(aRootPath, resSet); |
| return findType(type, eObjects); |
| } |
| |
| /** |
| * @param <T> |
| * @param type |
| * @param eObjects |
| * @return |
| */ |
| @SuppressWarnings("unchecked") |
| private <T> T findType(Class<T> type, EList<EObject> eObjects) { |
| T element = null; |
| for (EObject eobject : eObjects) { |
| if (type.isAssignableFrom(eobject.getClass())) { |
| element = (T) eobject; |
| break; |
| } |
| } |
| return element; |
| } |
| |
| // /** |
| // * Loads resource at given URI and returns all top elements matching the specified type |
| // * |
| // * @param <T> |
| // * @param aRootPath |
| // * @param type |
| // * @return |
| // * @throws ResourceHandlingException |
| // */ |
| // @SuppressWarnings("unchecked") |
| // public <T> List<T> deserializeElements(URI aRootPath, Class<T> type) throws ResourceHandlingException { |
| // if (aRootPath == null) { |
| // return null; |
| // } |
| // |
| // List<T> resElements = new ArrayList<T>(); |
| // EList<EObject> eObjects = getObjects(aRootPath); |
| // |
| // for (EObject eobject : eObjects) { |
| // if (type.isAssignableFrom(eobject.getClass())) { |
| // resElements.add((T) eobject); |
| // } |
| // } |
| // |
| // return resElements; |
| // } |
| |
| /** |
| * Load resource from given URI |
| * |
| * @param resourcePath |
| * @return |
| * @throws ResourceHandlingException |
| */ |
| private EList<EObject> getObjects(URI resourcePath) throws ResourceHandlingException { |
| // Create the resouce pointing to the specified URI |
| Resource resource = createResourceSetWithResource(resourcePath); |
| return getObjects(resourcePath, resource); |
| } |
| |
| /** |
| * @param resourcePath |
| * @param resSet |
| * @return |
| * @throws ResourceHandlingException |
| */ |
| private EList<EObject> getObjects(URI resourcePath, ResourceSet resSet) throws ResourceHandlingException { |
| Resource resource = createResource(resourcePath, resSet); |
| return getObjects(resourcePath, resource); |
| } |
| |
| /** |
| * @param resourcePath |
| * @param resource |
| * - resource associated to one to be loaded |
| * @return |
| * @throws ResourceHandlingException |
| */ |
| private EList<EObject> getObjects(URI resourcePath, Resource resource) throws ResourceHandlingException { |
| // Load resources |
| try { |
| resource.load(null); |
| } catch (IOException e) { |
| String message = new StringBuffer("Unable to load resource at URI: " + resourcePath.toString()).toString(); |
| ResourceHandlingException exception = new ResourceHandlingException(message, e); |
| throw exception; |
| } |
| |
| EList<EObject> eObjects = resource.getContents(); |
| return eObjects; |
| } |
| |
| /* (non-Javadoc) |
| * @see org.eclipse.mylyn.reviews.r4e.core.model.serial.impl.IModelReader#reloadResource(org.eclipse.emf.ecore.resource.Resource) |
| */ |
| @Override |
| public void reloadResource(Resource resource) throws ResourceHandlingException { |
| if (resource == null) { |
| return; |
| } |
| |
| try { |
| resource.load(fOptions); |
| } catch (IOException e) { |
| StringBuilder sb = new StringBuilder("Unable to load resource"); |
| URI resURI = resource.getURI(); |
| if (resURI != null) { |
| sb.append(": " + resource.getURI().toString()); |
| } |
| throw new ResourceHandlingException(sb.toString(), e); |
| } |
| } |
| |
| /* (non-Javadoc) |
| * @see org.eclipse.mylyn.reviews.r4e.core.model.serial.impl.IModelReader#selectUsrReviewGroupRes(org.eclipse.emf.common.util.URI) |
| */ |
| @Override |
| public List<URI> selectUsrReviewGroupRes(URI aFolder) { |
| return selectFiles(aFolder, IRWUserBasedRes.USER_GROUP_REVS_PATT); |
| } |
| |
| /* (non-Javadoc) |
| * @see org.eclipse.mylyn.reviews.r4e.core.model.serial.impl.IModelReader#selectUsrCommentsRes(org.eclipse.emf.common.util.URI) |
| */ |
| @Override |
| public List<URI> selectUsrCommentsRes(URI aFolder) { |
| return selectFiles(aFolder, IRWUserBasedRes.USER_COMMENTS_PATT); |
| } |
| |
| /* (non-Javadoc) |
| * @see org.eclipse.mylyn.reviews.r4e.core.model.serial.impl.IModelReader#selectUsrItemsRes(org.eclipse.emf.common.util.URI) |
| */ |
| @Override |
| public List<URI> selectUsrItemsRes(URI aFolder) { |
| return selectFiles(aFolder, IRWUserBasedRes.USER_ITEMS_PATT); |
| } |
| |
| /* (non-Javadoc) |
| * @see org.eclipse.mylyn.reviews.r4e.core.model.serial.impl.IModelReader#isGroupResourceUri(org.eclipse.emf.common.util.URI) |
| */ |
| @Override |
| public Boolean isGroupResourceUri(URI uri) { |
| return uriMatch(uri, IRWUserBasedRes.ROOT_GROUP_PATT); |
| } |
| |
| /** |
| * @param aFolder |
| * @param pattern |
| * @return |
| */ |
| private List<URI> selectFiles(URI aFolder, Pattern pattern) { |
| Matcher matcher = null; |
| List<URI> filesRes = new ArrayList<URI>(); |
| String path = URI.decode(aFolder.devicePath()); |
| File folder = new File(path); |
| |
| if (folder.exists()) { |
| String[] files = folder.list(); |
| for (String file : files) { |
| matcher = pattern.matcher(file); |
| if (matcher.find()) { |
| filesRes.add(aFolder.appendSegment(file)); |
| } |
| } |
| } |
| |
| return filesRes; |
| } |
| |
| /** |
| * @param uri |
| * @param pattern |
| * @return |
| */ |
| private Boolean uriMatch(URI uri, Pattern pattern) { |
| if (uri == null || pattern == null) { |
| return null; |
| } |
| |
| String uriStr = uri.toString(); |
| Matcher matcher = pattern.matcher(uriStr); |
| if (matcher.find()) { |
| return true; |
| } |
| return false; |
| } |
| |
| /** |
| * @param aPathToResource |
| * @param resourceSet |
| * @return |
| */ |
| private Resource createResource(URI aPathToResource, ResourceSet resourceSet) { |
| Resource groupResource = null; |
| |
| if (aPathToResource != null && resourceSet != null) { |
| // Create the resource for given group |
| groupResource = resourceSet.getResource(aPathToResource, true); |
| } |
| return groupResource; |
| } |
| |
| } |