com.liferay.ide.project.core.SDKClasspathContainerInitializer.java Source code

Java tutorial

Introduction

Here is the source code for com.liferay.ide.project.core.SDKClasspathContainerInitializer.java

Source

/*******************************************************************************
 * Copyright (c) 2000-present Liferay, Inc. All rights reserved.
 *
 * This library 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 2.1 of the License, or (at your option)
 * any later version.
 *
 * This library 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.
 *
 *******************************************************************************/

package com.liferay.ide.project.core;

import com.liferay.ide.sdk.core.SDK;
import com.liferay.ide.sdk.core.SDKUtil;
import com.liferay.ide.server.core.portal.PortalBundle;
import com.liferay.ide.server.util.ServerUtil;

import org.eclipse.core.runtime.CoreException;
import org.eclipse.core.runtime.IPath;
import org.eclipse.jdt.core.ClasspathContainerInitializer;
import org.eclipse.jdt.core.IClasspathAttribute;
import org.eclipse.jdt.core.IClasspathContainer;
import org.eclipse.jdt.core.IClasspathEntry;
import org.eclipse.jdt.core.IJavaProject;
import org.eclipse.jdt.core.JavaCore;
import org.eclipse.jst.common.jdt.internal.classpath.ClasspathDecorations;
import org.eclipse.jst.common.jdt.internal.classpath.ClasspathDecorationsManager;

/**
 * @author Simon.Jiang
 */
@SuppressWarnings("restriction")
public class SDKClasspathContainerInitializer extends ClasspathContainerInitializer {
    protected static final ClasspathDecorationsManager cpDecorations = SDKClasspathContainer
            .getDecorationsManager();

    @Override
    public boolean canUpdateClasspathContainer(IPath containerPath, IJavaProject project) {
        return true;
    }

    private IPath[] getSDKDependencies(IJavaProject project) {
        IPath[] dependencyJarPaths = null;

        SDK sdk = SDKUtil.getSDKFromProjectDir(project.getProject().getLocation().toFile());

        if (sdk != null) {
            dependencyJarPaths = sdk.getDependencyJarPaths();
        }

        return dependencyJarPaths;
    }

    @Override
    public void initialize(IPath containerPath, IJavaProject project) throws CoreException {
        IClasspathContainer classpathContainer = null;

        String root = containerPath.segment(0);

        if (!SDKClasspathContainer.ID.equals(root)) {
            final String msg = "Invalid plugin classpath container, expecting container root "; //$NON-NLS-1$
            throw new CoreException(ProjectCore.createErrorStatus(msg + SDKClasspathContainer.ID));
        }

        PortalBundle bundle = ServerUtil.getPortalBundle(project.getProject());

        if (bundle == null) {
            final String msg = "Invalid sdk properties setting.";
            throw new CoreException(ProjectCore.createErrorStatus(msg));
        }

        IPath globalDir = bundle.getAppServerLibGlobalDir();

        IPath portalDir = bundle.getAppServerPortalDir();

        IPath bundleDir = bundle.getAppServerDir();

        IPath[] bundleDependencyJars = bundle.getBundleDependencyJars();

        IPath[] sdkDependencyJarPaths = getSDKDependencies(project);

        if (portalDir == null) {
            return;
        }

        classpathContainer = new SDKClasspathContainer(containerPath, project, portalDir, null, null, globalDir,
                bundleDir, bundleDependencyJars, sdkDependencyJarPaths);

        JavaCore.setClasspathContainer(containerPath, new IJavaProject[] { project },
                new IClasspathContainer[] { classpathContainer }, null);
    }

    @Override
    public void requestClasspathContainerUpdate(IPath containerPath, IJavaProject project,
            IClasspathContainer containerSuggestion) throws CoreException {
        final String key = SDKClasspathContainer.getDecorationManagerKey(project.getProject(),
                containerPath.toString());

        final IClasspathEntry[] entries = containerSuggestion.getClasspathEntries();

        cpDecorations.clearAllDecorations(key);

        for (int i = 0; i < entries.length; i++) {
            final IClasspathEntry entry = entries[i];

            final IPath srcpath = entry.getSourceAttachmentPath();
            final IPath srcrootpath = entry.getSourceAttachmentRootPath();
            final IClasspathAttribute[] attrs = entry.getExtraAttributes();

            if (srcpath != null || attrs.length > 0) {
                final String eid = entry.getPath().toString();
                final ClasspathDecorations dec = new ClasspathDecorations();

                dec.setSourceAttachmentPath(srcpath);
                dec.setSourceAttachmentRootPath(srcrootpath);
                dec.setExtraAttributes(attrs);

                cpDecorations.setDecorations(key, eid, dec);
            }
        }

        cpDecorations.save();

        IPath portalDir = null;
        IPath portalGlobalDir = null;
        String javadocURL = null;
        IPath sourceLocation = null;
        IPath bundleDir = null;
        IPath[] bundleDependencyJarPaths = null;

        PortalBundle bundle = ServerUtil.getPortalBundle(project.getProject());

        boolean containerChanged = true;

        if (containerSuggestion instanceof SDKClasspathContainer) {
            portalDir = ((SDKClasspathContainer) containerSuggestion).getPortalDir();
            bundleDir = ((SDKClasspathContainer) containerSuggestion).getBundleDir();
            portalGlobalDir = ((SDKClasspathContainer) containerSuggestion).getPortalGlobalDir();
            javadocURL = ((SDKClasspathContainer) containerSuggestion).getJavadocURL();
            sourceLocation = ((SDKClasspathContainer) containerSuggestion).getSourceLocation();
            bundleDependencyJarPaths = ((SDKClasspathContainer) containerSuggestion).getBundleLibDependencyPath();

            if (bundle != null && bundle.getAppServerPortalDir().equals(portalDir)) {
                containerChanged = false;
            }
        }

        if (containerChanged == true) {
            if (bundle == null) {
                return;
            }

            portalDir = bundle.getAppServerPortalDir();
            portalGlobalDir = bundle.getAppServerLibGlobalDir();
            bundleDependencyJarPaths = bundle.getBundleDependencyJars();
        }

        IPath[] sdkDependencyPaths = getSDKDependencies(project);

        if (portalDir != null && portalGlobalDir != null) {
            IClasspathContainer newContainer = new SDKClasspathContainer(containerPath, project, portalDir,
                    javadocURL, sourceLocation, portalGlobalDir, bundleDir, bundleDependencyJarPaths,
                    sdkDependencyPaths);

            JavaCore.setClasspathContainer(containerPath, new IJavaProject[] { project },
                    new IClasspathContainer[] { newContainer }, null);
        }
    }

}