package com.dubture.composer.internal.core.resources; import org.eclipse.core.resources.IFile; import org.eclipse.core.resources.IProject; import org.eclipse.core.runtime.IPath; import org.eclipse.core.runtime.Path; import org.eclipse.dltk.core.DLTKCore; import org.eclipse.dltk.core.IScriptProject; import com.dubture.composer.core.log.Logger; import com.dubture.composer.core.resources.IComposerProject; import com.dubture.getcomposer.core.ComposerConstants; import com.dubture.getcomposer.core.ComposerPackage; import com.dubture.getcomposer.core.collection.ComposerPackages; import com.dubture.getcomposer.core.collection.Psr; import com.dubture.getcomposer.core.objects.Autoload; import com.dubture.getcomposer.core.objects.Namespace; public class ComposerProject implements IComposerProject { private IProject project; private IScriptProject scriptProject; private ComposerPackage composer = null; private IFile json = null; private String vendorDir = null; private IPath vendorPath = null; public ComposerProject(IProject project) { this.project = project; IFile file = project.getFile(ComposerConstants.COMPOSER_JSON); if (file != null && file.exists()) { composer = new ComposerPackage(); try { composer.fromJson(file.getLocation().toFile()); } catch (Exception e) { } } } public ComposerProject(IScriptProject project) { this(project.getProject()); scriptProject = project; } @Override public IPath getFullPath() { return project.getFullPath(); } @Override public String getVendorDir() { if (vendorDir == null) { if (composer != null && composer.getConfig() != null) { vendorDir = composer.getConfig().getVendorDir(); } if (vendorDir == null || vendorDir.trim().isEmpty()) { vendorDir = ComposerConstants.VENDOR_DIR_DEFAULT; // default } } return vendorDir; } @Override public IPath getVendorPath() { if (vendorPath == null) { IPath root = project.getLocation(); String vendor = getVendorDir(); if (root == null || root.segmentCount() <= 1) { throw new RuntimeException("Error getting composer vendor path"); } vendorPath = root.removeLastSegments(1).addTrailingSeparator().append(vendor); } return vendorPath; } @Override public IFile getComposerJson() { if (json == null) { json = project.getFile(ComposerConstants.COMPOSER_JSON); } return json; } @Override public ComposerPackage getComposerPackage() { if (composer == null) { try { IFile json = getComposerJson(); if (json == null) { return null; } composer = new ComposerPackage(json.getLocation().toFile()); } catch (Exception e) { } } return composer; } @Override public IProject getProject() { return project; } @Override public IScriptProject getScriptProject() { if (scriptProject == null) { scriptProject = DLTKCore.create(project); } return scriptProject; } @Override public ComposerPackages getInstalledPackages() { String vendor = getVendorDir(); ComposerPackages packages = new ComposerPackages(); IFile installed = project.getFile(vendor + "/composer/installed.json"); if (installed != null && installed.exists()) { packages.addAll(loadInstalled(installed)); } return packages; } @Override public boolean isValidComposerJson() { IFile json = getComposerJson(); if (json != null && json.exists()) { try { new ComposerPackage(json.getLocation().toFile()); return true; } catch (Exception e) { return false; } } return false; } // @Override // public ComposerPackages getInstalledDevPackages() { // String vendor = getVendorDir(); // ComposerPackages packages = new ComposerPackages(); // // IFile installedDev = project.getFile(vendor + "/composer/installed_dev.json"); // if (installedDev != null && installedDev.exists()) { // packages.addAll(loadInstalled(installedDev)); // } // // return packages; // } // // @Override // public ComposerPackages getAllInstalledPackages() { // ComposerPackages packages = getInstalledPackages(); // packages.addAll(getInstalledDevPackages()); // return packages; // } protected ComposerPackages loadInstalled(IFile installed) { try { if (installed.getLocation() != null) { return new ComposerPackages(installed.getLocation().toFile()); } } catch (Exception e) { Logger.logException(e); } return new ComposerPackages(); } @Override public String getNamespace(IPath path) { Autoload autoload = getComposerPackage().getAutoload(); // look for psr4 first String namespace = getPsrNamespace(path, autoload.getPsr4()); if (namespace == null) { namespace = getPsrNamespace(path, autoload.getPsr0()); } return namespace; } private String getPsrNamespace(IPath path, Psr psr) { IPath appendix = new Path(""); while (!path.isEmpty()) { Namespace namespace = psr.getNamespaceForPath(path.addTrailingSeparator().toString()); if (namespace == null) { namespace = psr.getNamespaceForPath(path.removeTrailingSeparator().toString()); } if (namespace != null) { String nmspc = namespace.getNamespace(); IPath nmspcPath = new Path(nmspc.replace("\\", "/")); int match = nmspcPath.matchingFirstSegments(appendix); appendix = appendix.removeFirstSegments(match); if (appendix.segmentCount() > 0) { nmspc += (!nmspc.isEmpty() ? "\\" : "") + appendix.removeTrailingSeparator().toString().replace("/", "\\"); } nmspc = nmspc.replace("\\\\", "\\"); if (nmspc.endsWith("\\")) { nmspc = nmspc.substring(0, nmspc.length() - 1); } return nmspc; } appendix = new Path(path.lastSegment() + "/" + appendix.toString()); path = path.removeLastSegments(1); } return null; } }