/** * Copyright 2004-2016 Riccardo Solmi. All rights reserved. * This file is part of the Whole Platform. * * The Whole Platform is free software: you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * The Whole Platform is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with the Whole Platform. If not, see <http://www.gnu.org/licenses/>. */ package org.whole.lang.artifacts.visitors; import java.io.InputStream; import org.eclipse.core.resources.IWorkspaceRoot; import org.eclipse.core.resources.ResourcesPlugin; import org.eclipse.core.runtime.CoreException; import org.eclipse.core.runtime.IPath; import org.eclipse.core.runtime.IProgressMonitor; import org.eclipse.core.runtime.NullProgressMonitor; import org.whole.lang.artifacts.model.Attribute; import org.whole.lang.artifacts.model.Extension; import org.whole.lang.artifacts.model.FileArtifact; import org.whole.lang.artifacts.model.FolderArtifact; import org.whole.lang.artifacts.model.Name; import org.whole.lang.artifacts.model.NameWithExtension; import org.whole.lang.artifacts.model.PersistenceKitId; import org.whole.lang.artifacts.model.Project; import org.whole.lang.artifacts.reflect.ArtifactsEntityDescriptorEnum; import org.whole.lang.artifacts.util.ArtifactsWorkspaceUtils; import org.whole.lang.bindings.IBindingManager; import org.whole.lang.codebase.IPersistenceKit; import org.whole.lang.codebase.IPersistenceProvider; import org.whole.lang.codebase.StreamPersistenceProvider; import org.whole.lang.commons.factories.CommonsEntityAdapterFactory; import org.whole.lang.model.IEntity; import org.whole.lang.operations.OperationCanceledException; import org.whole.lang.reflect.ReflectionFactory; import org.whole.lang.util.StringUtils; /** * @author Riccardo Solmi, Enrico Persiani */ public class LoadContentsVisitor extends ArtifactsTraverseAllVisitor { private IBindingManager bindings; public LoadContentsVisitor(IBindingManager bindings) { this.bindings = bindings; } public final IBindingManager env() { return bindings; } //FIXME progress setup private IProgressMonitor progressMonitor; public final IProgressMonitor progressMonitor() { if (progressMonitor == null) { // progressMonitor = wGetOperation().getProgressMonitor().getAdapter(IProgressMonitor.class); // if (progressMonitor == null) progressMonitor = new NullProgressMonitor(); } return progressMonitor; } @Override public void visit(FileArtifact file) { env().wEnterScope(); file.getName().accept(this); file.getMetadata().accept(this); String fileName = env().wStringValue("name"); IWorkspaceRoot workspaceRoot = ResourcesPlugin.getWorkspace().getRoot(); IPath filePath = ArtifactsWorkspaceUtils.getParentPath(bindings).append(fileName); InputStream in; try { in = workspaceRoot.getFile(filePath).getContents(true); } catch (CoreException e) { throw new OperationCanceledException(e); } env().wDefValue("className", StringUtils.stripFileExtension(fileName)); env().wDefValue("persistenceProvider", new StreamPersistenceProvider(in, null, env()));//TODO use IFile file.setContent(CommonsEntityAdapterFactory.createStageUpFragment( ArtifactsEntityDescriptorEnum.Content, readContents())); env().wExitScope(); } private IEntity readContents() { IPersistenceProvider pp = (IPersistenceProvider) env().wGetValue("persistenceProvider"); try { IPersistenceKit pk = ReflectionFactory.getPersistenceKit(env().wStringValue("persistenceKitId")); return pk.readModel(pp); } catch (Exception e) { throw new OperationCanceledException(e); } } @Override public void visit(Project project) { env().wEnterScope(); project.getName().accept(this); project.getMetadata().accept(this); String projectName = env().wStringValue("name"); IWorkspaceRoot workspaceRoot = ResourcesPlugin.getWorkspace().getRoot(); env().wDefValue("projectName", projectName); env().wDefValue("project", workspaceRoot.getProject(projectName)); project.getArtifacts().accept(this); env().wExitScope(); } @Override public void visit(FolderArtifact folder) { env().wEnterScope(); folder.getName().accept(this); folder.getMetadata().accept(this); String folderName = env().wStringValue("name"); IWorkspaceRoot workspaceRoot = ResourcesPlugin.getWorkspace().getRoot(); IPath folderPath = ArtifactsWorkspaceUtils.getParentPath(bindings).append(folderName); env().wDefValue("folderName", folderName); env().wDefValue("folder", workspaceRoot.getFolder(folderPath)); folder.getArtifacts().accept(this); env().wExitScope(); } //TODO add visit(PackageArtifact) public void visit(Name entity) { env().wDef("name", entity); } public void visit(Extension entity) { env().wDef("extension", entity); } public void visit(NameWithExtension entity) { super.visit(entity); env().wSetValue("name", env().wStringValue("name")+"."+env().wStringValue("extension")); } public void visit(Attribute entity) { env().wDefValue(entity.getValue().getName(), true); } public void visit(PersistenceKitId entity) { env().wDefValue("persistenceKitId", entity.wStringValue()); } }