| /******************************************************************************* |
| * Copyright (c) 2009, 2019 Xored Software Inc and others. |
| * All rights reserved. This program and the accompanying materials |
| * are made available under the terms of the Eclipse Public License v2.0 |
| * which accompanies this distribution, and is available at |
| * https://www.eclipse.org/legal/epl-v20.html |
| * |
| * Contributors: |
| * Xored Software Inc - initial API and implementation and/or initial documentation |
| *******************************************************************************/ |
| package org.eclipse.rcptt.internal.core.model; |
| |
| import java.io.InputStream; |
| |
| import org.eclipse.core.resources.IFile; |
| 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.rcptt.core.model.ModelException; |
| import org.eclipse.rcptt.core.model.Q7Status; |
| import org.eclipse.rcptt.core.model.Q7Status.Q7StatusCode; |
| import org.eclipse.rcptt.core.persistence.IPersistenceModel; |
| import org.eclipse.rcptt.core.persistence.PersistenceManager; |
| import org.eclipse.rcptt.core.persistence.plain.PlainTextPersistenceModel; |
| import org.eclipse.rcptt.core.scenario.NamedElement; |
| import org.eclipse.rcptt.internal.core.Q7LazyResource; |
| |
| public class Q7ResourceInfo extends OpenableElementInfo { |
| private final Resource resource; |
| private NamedElement element; |
| public long timestamp; |
| private final String plainStoreFormat; |
| |
| public Q7ResourceInfo(String storeFormat, URI uri) { |
| this.plainStoreFormat = storeFormat; |
| if (uri == null) { |
| resource = null; |
| } else { |
| resource = new Q7LazyResource(uri); |
| resource.setTrackingModification(true); |
| } |
| } |
| |
| public void load(IFile file) throws ModelException { |
| if (resource == null) |
| throw new NullPointerException("Resource info " + plainStoreFormat + " can't be associated with a file"); |
| |
| if (file != null) { |
| timestamp = file.getModificationStamp(); |
| } |
| URI uri = toURI(file); |
| IPersistenceModel model = getPersistenceModel(); |
| |
| if (file != null && !file.exists()) { |
| Q7Status status = new Q7Status(Q7Status.ERROR, "Element: " + file.getFullPath() |
| + " doesn't exist"); |
| status.setStatusCode(Q7StatusCode.NotPressent); |
| throw new ModelException(status); |
| } |
| InputStream stream = PersistenceManager.getInstance().loadMetadata(model); |
| |
| try { |
| if ((stream == null && file != null) |
| && !model.isAllowEmptyMetadataContent()) { |
| stream = file.getContents(); |
| } |
| if (stream != null) { |
| resource.load(stream, PersistenceManager.getOptions()); |
| } |
| model.updateMetadata(); |
| EList<EObject> contents = resource.getContents(); |
| resource.setModified(false); |
| if (contents.size() == 0 ) { |
| throw new RuntimeException("Empty resource " + uri); |
| } |
| for (EObject eObject : contents) { |
| if (eObject instanceof NamedElement) { |
| element = (NamedElement) eObject; |
| } |
| } |
| if (element == null) { |
| throw new ModelException(new Q7Status(Q7Status.ERROR, "Illegal object type: " + contents.get(0).getClass().getName())); |
| } |
| } catch (Exception e) { |
| // Q7Plugin.log(e); |
| PersistenceManager.getInstance().remove(resource); |
| throw new ModelException(e, Q7Status.ERROR); |
| } finally { |
| if (stream != null) { |
| try { |
| stream.close(); |
| } catch (Throwable e) { |
| |
| } |
| } |
| } |
| } |
| |
| public static URI toURI(IFile file) { |
| return URI.createPlatformResourceURI(file != null ? file |
| .getFullPath().toString() : "__uri__", true); |
| } |
| |
| protected IPersistenceModel getPersistenceModel() { |
| return PersistenceManager.getInstance().getModel(resource); |
| } |
| |
| public void unload() { |
| PersistenceManager.getInstance().remove(resource); |
| element = null; |
| timestamp = 0; |
| } |
| |
| public NamedElement getNamedElement() { |
| return element; |
| } |
| |
| public void extractAllPersistence() { |
| getPersistenceModel().extractAll(); |
| } |
| |
| public void save() { |
| IPersistenceModel model = getPersistenceModel(); |
| if (model instanceof PlainTextPersistenceModel) { |
| ((PlainTextPersistenceModel)model).setSaveFormat(plainStoreFormat); |
| } |
| PersistenceManager.getInstance().saveResource(resource); |
| resource.setModified(false); |
| model.setUnmodified(); |
| } |
| |
| public IPersistenceModel getModel() { |
| return getPersistenceModel(); |
| } |
| |
| public boolean hasChanges() { |
| if (resource == null) { |
| return true; |
| } |
| return resource.isModified() || getPersistenceModel().isModified(); |
| } |
| |
| public void createNamedElement(NamedElement createNamedElement) { |
| this.element = createNamedElement; |
| this.resource.getContents().add(this.element); |
| } |
| |
| public Resource getResource() { |
| return resource; |
| } |
| |
| public void updatePersistenceModel(IPersistenceModel newModel) { |
| PersistenceManager.getInstance().replaceModelWith(resource, newModel); |
| } |
| } |