Java tutorial
/******************************************************************************* * 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; } }