com.liferay.ide.hook.core.operation.AddHookOperation.java Source code

Java tutorial

Introduction

Here is the source code for com.liferay.ide.hook.core.operation.AddHookOperation.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.hook.core.operation;

import com.liferay.ide.core.ILiferayConstants;
import com.liferay.ide.core.ILiferayPortal;
import com.liferay.ide.core.ILiferayProject;
import com.liferay.ide.core.IWebProject;
import com.liferay.ide.core.LiferayCore;
import com.liferay.ide.core.StringBufferOutputStream;
import com.liferay.ide.core.util.CoreUtil;
import com.liferay.ide.core.util.StringPool;
import com.liferay.ide.hook.core.HookCore;
import com.liferay.ide.hook.core.dd.HookDescriptorHelper;
import com.liferay.ide.hook.core.util.HookUtil;
import com.liferay.ide.project.core.util.ProjectUtil;

import java.io.ByteArrayInputStream;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.UnsupportedEncodingException;
import java.util.ArrayList;
import java.util.List;
import java.util.Properties;
import java.util.Set;

import org.eclipse.core.commands.ExecutionException;
import org.eclipse.core.resources.IFile;
import org.eclipse.core.resources.IFolder;
import org.eclipse.core.resources.IProject;
import org.eclipse.core.resources.IResource;
import org.eclipse.core.runtime.CoreException;
import org.eclipse.core.runtime.IAdaptable;
import org.eclipse.core.runtime.IPath;
import org.eclipse.core.runtime.IProgressMonitor;
import org.eclipse.core.runtime.IStatus;
import org.eclipse.core.runtime.Path;
import org.eclipse.core.runtime.Status;
import org.eclipse.jdt.core.IPackageFragmentRoot;
import org.eclipse.jface.text.BadLocationException;
import org.eclipse.jface.text.templates.TemplateException;
import org.eclipse.jst.j2ee.internal.common.operations.INewJavaClassDataModelProperties;
import org.eclipse.wst.common.frameworks.datamodel.AbstractDataModelOperation;
import org.eclipse.wst.common.frameworks.datamodel.IDataModel;

/**
 * @author Greg Amerson
 * @author Simon Jiang
 * @author Terry Jia
 * @author Andy Wu
 */
@SuppressWarnings({ "restriction", "unchecked" })
public class AddHookOperation extends AbstractDataModelOperation implements INewHookDataModelProperties {

    public AddHookOperation(IDataModel model) {
        super(model);
    }

    @Override
    public IStatus execute(IProgressMonitor monitor, IAdaptable info) throws ExecutionException {
        final IDataModel dm = getDataModel();

        IStatus retval = null;

        final IStatus status = checkDescriptorFile(getTargetProject());

        if (!status.isOK()) {
            return status;
        }

        if (dm.getBooleanProperty(CREATE_CUSTOM_JSPS)) {
            retval = createCustomJSPs(dm);
        }

        if (dm.getBooleanProperty(CREATE_PORTAL_PROPERTIES)) {
            retval = createPortalProperties(dm);
        }

        if (dm.getBooleanProperty(CREATE_SERVICES)) {
            retval = createServices(dm);
        }

        if (dm.getBooleanProperty(CREATE_LANGUAGE_PROPERTIES)) {
            retval = createLanguageProperties(dm);
        }

        return retval;
    }

    public IProject getTargetProject() {
        String projectName = model.getStringProperty(PROJECT_NAME);

        return ProjectUtil.getProject(projectName);
    }

    protected IStatus checkDescriptorFile(IProject project) {
        final IWebProject webproject = LiferayCore.create(IWebProject.class, project);

        if (webproject == null || webproject.getDefaultDocrootFolder() == null) {
            return HookCore.createErrorStatus("Could not find webapp root folder."); //$NON-NLS-1$
        }

        final IFolder webappRoot = webproject.getDefaultDocrootFolder();

        // IDE-648 IDE-110
        final Path path = new Path("WEB-INF/" + ILiferayConstants.LIFERAY_HOOK_XML_FILE); //$NON-NLS-1$
        final IFile hookDescriptorFile = webappRoot.getFile(path);

        if (!hookDescriptorFile.exists()) {
            try {
                createDefaultHookDescriptorFile(hookDescriptorFile);
            } catch (Exception ex) {
                return HookCore.createErrorStatus(ex);
            }
        }

        return Status.OK_STATUS;
    }

    protected IFile copyPortalJSPToProject(IPath portalDir, String portalJsp, IFolder customFolder)
            throws Exception {
        final IPath portalJspPath = new Path(portalJsp);

        final IPath originalPortalJspPath = portalDir.append(portalJsp);

        final IFile newJspFile = customFolder.getFile(portalJspPath);

        CoreUtil.prepareFolder((IFolder) newJspFile.getParent());

        if (!newJspFile.getLocation().toFile().exists()) {
            if (originalPortalJspPath.toFile().exists()) {
                final FileInputStream fis = new FileInputStream(originalPortalJspPath.toFile());

                if (newJspFile.exists()) {
                    newJspFile.setContents(fis, IResource.FORCE, null);
                } else {
                    newJspFile.create(fis, true, null);
                }
            } else {
                CoreUtil.createEmptyFile(newJspFile);
            }
        }

        return newJspFile;
    }

    protected IStatus createCustomJSPs(IDataModel dm) {
        IProject project = getTargetProject();

        IFolder defaultWebappRootFolder = LiferayCore.create(IWebProject.class, project).getDefaultDocrootFolder();

        String customJSPsFolder = dm.getStringProperty(CUSTOM_JSPS_FOLDER);

        String customFolderValue = defaultWebappRootFolder.getFullPath().append(customJSPsFolder)
                .toPortableString();

        IFolder customFolder = (IFolder) project.getWorkspace().getRoot().getFolder(new Path(customFolderValue));

        try {
            CoreUtil.prepareFolder(customFolder);
        } catch (CoreException e) {
            return HookCore.createErrorStatus(e);
        }

        final List<String[]> customJsps = (List<String[]>) dm.getProperty(CUSTOM_JSPS_ITEMS);
        final ILiferayProject liferayProject = LiferayCore.create(getTargetProject());

        final ILiferayPortal portal = liferayProject.adapt(ILiferayPortal.class);

        IStatus status = null;

        if (portal != null) {
            final IPath portalDir = portal.getAppServerPortalDir();

            if (customJsps != null && portalDir != null) {
                for (String[] customJsp : customJsps) {
                    try {
                        IFile copiedFile = copyPortalJSPToProject(portalDir, customJsp[0], customFolder);

                        if (copiedFile != null) {
                            Set<IFile> jspFilesCreated = (Set<IFile>) dm.getProperty(CUSTOM_JSPS_FILES_CREATED);

                            jspFilesCreated.add(copiedFile);

                            dm.setProperty(CUSTOM_JSPS_FILES_CREATED, jspFilesCreated);
                        }
                    } catch (Exception e) {
                        HookCore.logError(e);
                    }
                }
            }

            HookDescriptorHelper hookDescHelper = new HookDescriptorHelper(getTargetProject());

            status = hookDescHelper.setCustomJSPDir(this.model);

            if (this.model.getBooleanProperty(DISABLE_CUSTOM_JSP_FOLDER_VALIDATION)) {
                HookUtil.configureJSPSyntaxValidationExclude(getTargetProject(), customFolder, true);
            }
        } else {
            status = HookCore.createErrorStatus("Could not get portal info from project " + project.getName());
        }

        return status;
    }

    protected void createDefaultHookDescriptorFile(IFile hookDescriptorFile)
            throws UnsupportedEncodingException, CoreException, BadLocationException, TemplateException {
        HookDescriptorHelper helper = new HookDescriptorHelper(getTargetProject());
        helper.createDefaultDescriptor();
    }

    protected IStatus createLanguageProperties(IDataModel dm) {
        IProject project = getTargetProject();

        String contentFolderValue = dm.getStringProperty(CONTENT_FOLDER);

        IFolder contentFolder = (IFolder) project.getWorkspace().getRoot().getFolder(new Path(contentFolderValue));

        try {
            CoreUtil.prepareFolder(contentFolder);
        } catch (CoreException e) {
            return HookCore.createErrorStatus(e);
        }

        List<String[]> languagePropertiesFiles = (List<String[]>) dm.getProperty(LANGUAGE_PROPERTIES_ITEMS);

        if (languagePropertiesFiles != null) {
            for (String[] languagePropertyFile : languagePropertiesFiles) {
                try {
                    if (!languagePropertyFile[0].contains("*")) {
                        IFile createdFile = ProjectUtil.createEmptyProjectFile(languagePropertyFile[0],
                                contentFolder);

                        if (createdFile != null) {
                            Set<IFile> languageFilesCreated = (Set<IFile>) dm
                                    .getProperty(LANGUAGE_PROPERTIES_FILES_CREATED);

                            languageFilesCreated.add(createdFile);

                            dm.setProperty(LANGUAGE_PROPERTIES_FILES_CREATED, languageFilesCreated);
                        }
                    }
                } catch (Exception e) {
                    HookCore.logError(e);
                }
            }
        }

        HookDescriptorHelper hookDescHelper = new HookDescriptorHelper(getTargetProject());

        Set<IFile> languageFilesCreated = (Set<IFile>) dm.getProperty(LANGUAGE_PROPERTIES_FILES_CREATED);

        // need to get file paths relative to package root
        List<String> languageProperties = new ArrayList<String>();

        IPackageFragmentRoot packRoot = (IPackageFragmentRoot) model
                .getProperty(INewJavaClassDataModelProperties.JAVA_PACKAGE_FRAGMENT_ROOT);

        if (packRoot != null) {
            for (IFile languageFile : languageFilesCreated) {
                if (packRoot.getPath().isPrefixOf(languageFile.getFullPath())) {
                    String languageProperty = languageFile.getFullPath().makeRelativeTo(packRoot.getPath())
                            .toPortableString();

                    languageProperties.add(languageProperty);
                }
            }
        }

        IStatus status = hookDescHelper.addLanguageProperties(languageProperties);

        return status;

    }

    protected IStatus createPortalProperties(IDataModel dm) {
        IProject project = getTargetProject();

        String portalPropertiesFile = dm.getStringProperty(PORTAL_PROPERTIES_FILE);

        // check to see if we have an existing file to read in
        IPath portalPropertiesPath = new Path(portalPropertiesFile);

        IPath propertiesFilesPath = portalPropertiesPath.makeRelativeTo(project.getFullPath());

        IFile propertiesFile = project.getFile(propertiesFilesPath);

        Properties properties = new Properties();

        if (propertiesFile.exists()) {
            try {
                properties.load(propertiesFile.getContents());
            } catch (Exception e) {
                return HookCore.createErrorStatus(e);
            }
        }

        List<String[]> actionItems = (List<String[]>) dm.getProperty(PORTAL_PROPERTIES_ACTION_ITEMS);

        if (actionItems != null) {
            for (String[] actionItem : actionItems) {
                properties.put(actionItem[0], actionItem[1]);
            }
        }

        List<String[]> overrideItems = (List<String[]>) dm.getProperty(PORTAL_PROPERTIES_OVERRIDE_ITEMS);

        if (overrideItems != null) {
            for (String[] overrideItem : overrideItems) {
                properties.put(overrideItem[0], overrideItem[1]);
            }
        }

        StringBufferOutputStream buffer = new StringBufferOutputStream();

        try {
            properties.store(buffer, StringPool.EMPTY);
        } catch (IOException e) {
            return HookCore.createErrorStatus(e);
        }

        try {
            ByteArrayInputStream bis = new ByteArrayInputStream(buffer.toString().getBytes("UTF-8")); //$NON-NLS-1$

            if (propertiesFile.exists()) {
                propertiesFile.setContents(bis, IResource.FORCE, null);
            } else {
                CoreUtil.prepareFolder((IFolder) propertiesFile.getParent());

                propertiesFile.create(bis, true, null);
            }
        } catch (Exception e) {
            return HookCore.createErrorStatus(e);
        }

        HookDescriptorHelper hookDescHelper = new HookDescriptorHelper(getTargetProject());

        String propertiesClasspath = null;

        IPackageFragmentRoot packRoot = (IPackageFragmentRoot) model
                .getProperty(INewJavaClassDataModelProperties.JAVA_PACKAGE_FRAGMENT_ROOT);

        if (packRoot != null) {
            if (packRoot.getPath().isPrefixOf(propertiesFile.getFullPath())) {
                propertiesClasspath = propertiesFile.getFullPath().makeRelativeTo(packRoot.getPath())
                        .toPortableString();
            }
        }

        IStatus status = hookDescHelper.setPortalProperties(this.model, propertiesClasspath);

        return status;
    }

    protected IStatus createServices(IDataModel dm) {
        List<String[]> actionItems = (List<String[]>) dm.getProperty(SERVICES_ITEMS);

        HookDescriptorHelper hookDescHelper = new HookDescriptorHelper(getTargetProject());

        IStatus status = hookDescHelper.addActionItems(actionItems);

        return status;
    }

}