/** * Copyright (c) 2016 committers of YAKINDU 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: * committers of YAKINDU - initial API and implementation * */ package org.yakindu.sct.generator.c; import java.text.MessageFormat; import java.util.ArrayList; import java.util.List; import org.eclipse.core.runtime.IPath; import org.eclipse.core.runtime.Path; import org.eclipse.emf.common.util.URI; import org.yakindu.sct.generator.core.filesystem.ISCTFileSystemAccess; import com.google.inject.Inject; import com.google.inject.Singleton; /** * * @author thomas kutz - Initial API and contribution * */ @Singleton public class DefaultGenArtifactConfigurations implements IGenArtifactConfigurations { private static final String MSG_LOCATION_NOT_FOUND = "Artifact location for {0} not configured"; @Inject private ISCTFileSystemAccess sctFsa; protected List<GenArtifactConfiguration> generationArtifacts = new ArrayList<GenArtifactConfiguration>(); @Override public List<GenArtifactConfiguration> getConfigurations() { return generationArtifacts; } @Override public void configure(String artifactName, String outputConfigName, IContentTemplate contentTemplate) { generationArtifacts.add(new GenArtifactConfiguration(artifactName, outputConfigName, contentTemplate)); } protected URI getOutputFolder(String artifactName) { for (GenArtifactConfiguration artifact : generationArtifacts) { if (artifact.getName().equals(artifactName)) { return sctFsa.getURI("", artifact.getOutputName()); } } return null; } protected URI getURI(String artifactName) { for (GenArtifactConfiguration artifact : generationArtifacts) { if (artifact.getName().equals(artifactName)) { return sctFsa.getURI(artifact.getName(), artifact.getOutputName()); } } return null; } /** * @param target * either target artifact name or absolute target path which will * be transformed to a relative path based on * <code>fromArtifact</code> location * @param fromArtifact * artifact name whose location is used as base for relative path * computation * @return the relative path from <code>fromArtifact</code> to * <code>toTarget</code> */ @Override public String relativeTo(String target, String fromArtifact) { URI baseUri = getOutputFolder(fromArtifact); if (baseUri == null) { throw new IllegalArgumentException(MessageFormat.format(MSG_LOCATION_NOT_FOUND, fromArtifact)); } Path targetPath = new Path(target); if (targetPath.isAbsolute()) { return relativePath(target, relative(baseUri)); } URI absUri = getURI(target); if (absUri != null) { return relativePath(relative(absUri), relative(baseUri)); } throw new IllegalArgumentException(MessageFormat.format(MSG_LOCATION_NOT_FOUND, target)); } protected String relative(URI uri) { if (uri.isFile()) { return uri.toFileString(); } else if (uri.isPlatform()) { return uri.toPlatformString(true); } throw new IllegalArgumentException("Unknown URI " + uri); } protected String relativePath(String to, String from) { IPath basePath = new Path(from); IPath toPath = new Path(to); return toPath.makeRelativeTo(basePath).toOSString(); } }