/******************************************************************************* * 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.portlet.core.dd; import com.liferay.ide.core.ILiferayConstants; import com.liferay.ide.core.util.CoreUtil; import com.liferay.ide.core.util.NodeUtil; import com.liferay.ide.core.util.StringPool; import com.liferay.ide.portlet.core.operation.INewPortletClassDataModelProperties; import com.liferay.ide.project.core.descriptor.AddNewPortletOperation; import com.liferay.ide.project.core.descriptor.LiferayDescriptorHelper; import com.liferay.ide.project.core.descriptor.RemoveAllPortletsOperation; import com.liferay.ide.project.core.descriptor.RemoveSampleElementsOperation; import org.eclipse.core.resources.IFile; import org.eclipse.core.resources.IProject; import org.eclipse.core.runtime.IStatus; import org.eclipse.core.runtime.Status; import org.eclipse.wst.common.frameworks.datamodel.IDataModel; import org.eclipse.wst.xml.core.internal.provisional.document.IDOMDocument; import org.eclipse.wst.xml.core.internal.provisional.format.FormatProcessorXML; import org.w3c.dom.Element; import org.w3c.dom.Node; import org.w3c.dom.NodeList; /** * @author Gregory Amerson * @author Cindy Li * @author Simon Jiang * @author Kuo Zhang */ @SuppressWarnings( "restriction" ) public class LiferayPortletDescriptorHelper extends LiferayDescriptorHelper implements INewPortletClassDataModelProperties { public static final String DESCRIPTOR_FILE = ILiferayConstants.LIFERAY_PORTLET_XML_FILE; private static final String DESCRIPTOR_TEMPLATE = "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!DOCTYPE liferay-portlet-app PUBLIC \"-//Liferay//" //$NON-NLS-1$ + "DTD Portlet Application {0}//EN\" \"http://www.liferay.com/dtd/liferay-portlet-app_{1}.dtd" //$NON-NLS-1$ + "\">\n\n<liferay-portlet-app>\n\u0009<role-mapper>\n\u0009\u0009<role-name>administrator</role-" //$NON-NLS-1$ + "name>\n\u0009\u0009<role-link>Administrator</role-link>\n\u0009</role-mapper>\n\u0009<role-" //$NON-NLS-1$ + "mapper>\n\u0009\u0009<role-name>guest</role-name>\n\u0009\u0009<role-link>Guest</role-link>\n" //$NON-NLS-1$ + "\u0009</role-mapper>\n\u0009<role-mapper>\n\u0009\u0009<role-name>power-user</role-name>\n" //$NON-NLS-1$ + "\u0009\u0009<role-link>Power User</role-link>\n\u0009</role-mapper>\n\u0009<role-mapper>\n" //$NON-NLS-1$ + "\u0009\u0009<role-name>user</role-name>\n\u0009\u0009<role-link>User</role-link>\n\u0009</" //$NON-NLS-1$ + "role-mapper>\n</liferay-portlet-app>"; //$NON-NLS-1$ public LiferayPortletDescriptorHelper() { super(); } public LiferayPortletDescriptorHelper( IProject project ) { super( project ); } @Override protected void addDescriptorOperations() { addDescriptorOperation ( new AddNewPortletOperation() { @Override public IStatus addNewPortlet( final IDataModel model ) { IStatus status = Status.OK_STATUS; if( canAddNewPortlet( model ) ) { final IFile descriptorFile = getDescriptorFile(); if( descriptorFile != null ) { final DOMModelEditOperation domModelOperation = new DOMModelEditOperation( descriptorFile ) { protected void createDefaultFile() { createDefaultDescriptor( DESCRIPTOR_TEMPLATE , getDescriptorVersion() ); } protected IStatus doExecute( IDOMDocument document ) { return doAddNewPortlet( document, model ); } }; status = domModelOperation.execute(); } } return status; } } ); addDescriptorOperation ( new RemoveAllPortletsOperation() { @Override public IStatus removeAllPortlets() { return doRemoveAllPortlets(); } } ); addDescriptorOperation ( new RemoveSampleElementsOperation() { @Override public IStatus removeSampleElements() { return doRemoveAllPortlets(); } } ); } protected boolean canAddNewPortlet( IDataModel model ) { return model.getID().contains( "NewPortlet" ); } public IStatus configureLiferayPortletXml( final String newPortletName ) { IStatus status = Status.OK_STATUS; final IFile descriptorFile = getDescriptorFile(); if( descriptorFile != null ) { final DOMModelEditOperation operation = new DOMModelEditOperation( descriptorFile ) { protected IStatus doExecute( IDOMDocument document ) { final Element rootElement = document.getDocumentElement(); final NodeList portletNodes = rootElement.getElementsByTagName( "portlet" ); if( portletNodes.getLength() > 0 ) { final Element lastPortletElement = (Element) portletNodes.item( portletNodes.getLength() - 1 ); final Element portletName = NodeUtil.findChildElement( lastPortletElement, "portlet-name" ); portletName.replaceChild( document.createTextNode( newPortletName ), portletName.getFirstChild() ); } return Status.OK_STATUS; } }; status = operation.execute(); } return status; } protected IStatus doAddNewPortlet( IDOMDocument document, final IDataModel model ) { // <liferay-portlet-app> element Element rootElement = document.getDocumentElement(); // new <portlet> element Element newPortletElement = document.createElement( "portlet" ); //$NON-NLS-1$ NodeUtil.appendChildElement( newPortletElement, "portlet-name", model.getStringProperty( LIFERAY_PORTLET_NAME ) ); //$NON-NLS-1$ NodeUtil.appendChildElement( newPortletElement, "icon", model.getStringProperty( ICON_FILE ) ); //$NON-NLS-1$ if( model.getBooleanProperty( ADD_TO_CONTROL_PANEL ) ) { String entryCategory = model.getStringProperty( ENTRY_CATEGORY ).replaceAll( "^category\\.", StringPool.EMPTY ); //$NON-NLS-1$ NodeUtil.appendChildElement( newPortletElement, "control-panel-entry-category", entryCategory ); //$NON-NLS-1$ NodeUtil.appendChildElement( newPortletElement, "control-panel-entry-weight", model.getStringProperty( ENTRY_WEIGHT ) ); //$NON-NLS-1$ String javaPackage = model.getStringProperty( JAVA_PACKAGE ); if( ! CoreUtil.isNullOrEmpty( javaPackage ) ) { javaPackage = javaPackage + StringPool.PERIOD; } if( model.getBooleanProperty( CREATE_ENTRY_CLASS ) ) { NodeUtil.appendChildElement( newPortletElement, "control-panel-entry-class", javaPackage + //$NON-NLS-1$ //$NON-NLS-2$ model.getStringProperty( ENTRY_CLASS_NAME ) ); } } if( model.getBooleanProperty( ALLOW_MULTIPLE ) ) { NodeUtil.appendChildElement( newPortletElement, "instanceable", Boolean.toString( model.getBooleanProperty( ALLOW_MULTIPLE ) ) ); //$NON-NLS-1$ } NodeUtil.appendChildElement( newPortletElement, "header-portlet-css", model.getStringProperty( CSS_FILE ) ); //$NON-NLS-1$ NodeUtil.appendChildElement( newPortletElement, "footer-portlet-javascript", model.getStringProperty( JAVASCRIPT_FILE ) ); //$NON-NLS-1$ NodeUtil.appendChildElement( newPortletElement, "css-class-wrapper", model.getStringProperty( CSS_CLASS_WRAPPER ) ); //$NON-NLS-1$ // must append this before any role-mapper elements Element firstRoleMapper = null; for( Element child : getChildElements( rootElement ) ) { if( child.getNodeName().equals( "role-mapper" ) ) //$NON-NLS-1$ { firstRoleMapper = child; break; } } Node newline = document.createTextNode( System.getProperty( "line.separator" ) ); //$NON-NLS-1$ if( firstRoleMapper != null ) { rootElement.insertBefore( newPortletElement, firstRoleMapper ); rootElement.insertBefore( newline, firstRoleMapper ); } else { rootElement.appendChild( newPortletElement ); rootElement.appendChild( newline ); } // format the new node added to the model; FormatProcessorXML processor = new FormatProcessorXML(); processor.formatNode( newPortletElement ); return Status.OK_STATUS; } protected IStatus doRemoveAllPortlets() { final String portletTagName = "portlet"; DOMModelEditOperation domModelOperation = new DOMModelEditOperation( getDescriptorFile() ) { protected IStatus doExecute( IDOMDocument document ) { return removeAllElements( document, portletTagName ); } }; IStatus status = domModelOperation.execute(); return status; } public IFile getDescriptorFile() { return super.getDescriptorFile( DESCRIPTOR_FILE ); } }