/******************************************************************************* * 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; import com.liferay.ide.core.model.AbstractEditingModel; import com.liferay.ide.core.model.IModelChangedEvent; import com.liferay.ide.core.model.ModelChangedEvent; import com.liferay.ide.core.util.CoreUtil; import com.liferay.ide.core.util.StringPool; import java.io.InputStream; import java.io.StringWriter; import java.util.ArrayList; import java.util.Collections; import java.util.List; import org.apache.commons.configuration.ConfigurationException; import org.apache.commons.configuration.PropertiesConfiguration; import org.eclipse.core.resources.IFile; import org.eclipse.core.runtime.CoreException; import org.eclipse.jface.text.IDocument; import org.eclipse.wst.sse.core.internal.provisional.INodeAdapter; /** * @author Greg Amerson */ @SuppressWarnings( "restriction" ) public class PluginPackageModel extends AbstractEditingModel implements IPluginPackageModel { @SuppressWarnings( "unused" ) private static final long serialVersionUID = 1L; PropertiesConfiguration pluginPackageProperties; public PluginPackageModel( IFile file, IDocument document, boolean isReconciling ) { super( document, isReconciling ); try { pluginPackageProperties = new PluginPropertiesConfiguration(); InputStream is = file.getContents(); pluginPackageProperties.load( is ); is.close(); } catch( Exception e ) { PortletCore.logError( e ); } } public void addDependency( String propertyName, String value ) { if( CoreUtil.isNullOrEmpty( value ) ) { return; } String existingDeps = pluginPackageProperties.getString( propertyName, StringPool.EMPTY ); String[] existingValues = existingDeps.split( "," ); //$NON-NLS-1$ for( String existingValue : existingValues ) { if( value.equals( existingValue ) ) { return; } } String newDeps = null; if( CoreUtil.isNullOrEmpty( existingDeps ) ) { newDeps = value; } else { newDeps = existingDeps + "," + value; //$NON-NLS-1$ } pluginPackageProperties.setProperty( propertyName, newDeps ); flushProperties(); fireModelChanged( new ModelChangedEvent( this, IModelChangedEvent.INSERT, newDeps.split( "," ), propertyName ) ); //$NON-NLS-1$ } public void addPortalDependencyJar( String jar ) { addDependency( PROPERTY_PORTAL_DEPENDENCY_JARS, jar ); } public void addPortalDependencyTld( String tldFile ) { addDependency( PROPERTY_PORTAL_DEPENDENCY_TLDS, tldFile ); } public void addPortalDeployExcludeJar( String jar ) { addDependency( PROPERTY_DEPLOY_EXCLUDE, jar ); } public void addRequiredDeploymentContext( String context ) { addDependency( PROPERTY_REQUIRED_DEPLOYMENT_CONTEXTS, context ); } @Override public void adjustOffsets( IDocument document ) throws CoreException { } public void dispose() { pluginPackageProperties = null; } public String getAuthor() { return getStringProperty( PROPERTY_AUTHOR ); } public Boolean getBooleanProperty( String propertyName, boolean defaultVal ) { if( pluginPackageProperties != null ) { return pluginPackageProperties.getBoolean( propertyName, defaultVal ); } return null; } public String getChangeLog() { return getStringProperty( PROPERTY_CHANGE_LOG ); } public String getLicenses() { return getStringProperty( PROPERTY_LICENSES ); } public String getLiferayVersions() { return getStringProperty( PROPERTY_LIFERAY_VERSIONS ); } public String getLongDescription() { return getStringProperty( PROPERTY_LONG_DESCRIPTION ); } public String getModuleGroupId() { return getStringProperty( PROPERTY_MODULE_GROUP_ID ); } public String getModuleIncrementalVersion() { return getStringProperty( PROPERTY_MODULE_INCREMENTAL_VERSION ); } public String getName() { return getStringProperty( PROPERTY_NAME ); } public String getPageUrl() { return getStringProperty( PROPERTY_PAGE_URL ); } public String[] getPortalDependencyJars() { String portalJars = pluginPackageProperties.getString( PROPERTY_PORTAL_DEPENDENCY_JARS, null ); if( portalJars != null ) { return portalJars.split( "," ); //$NON-NLS-1$ } else { return new String[0]; } } public String[] getPortalDependencyTlds() { String portalTlds = pluginPackageProperties.getString( PROPERTY_PORTAL_DEPENDENCY_TLDS, null ); if( portalTlds != null ) { return portalTlds.split( "," ); //$NON-NLS-1$ } else { return new String[0]; } } public String[] getPortalDeloyExcludesJars() { String exludeJars = pluginPackageProperties.getString( PROPERTY_DEPLOY_EXCLUDE, null ); if( exludeJars != null ) { return exludeJars.split( "," ); //$NON-NLS-1$ } else { return new String[0]; } } public String[] getRequiredDeploymentContexts() { String contexts = pluginPackageProperties.getString( PROPERTY_REQUIRED_DEPLOYMENT_CONTEXTS, null ); if( contexts != null ) { return contexts.split( "," ); //$NON-NLS-1$ } else { return new String[0]; } } public String getShortDescription() { return getStringProperty( PROPERTY_SHORT_DESCRIPTION ); } public String getStringProperty( String propertyName ) { if( pluginPackageProperties != null ) { if( pluginPackageProperties.getProperty( propertyName ) != null ) { return pluginPackageProperties.getString( propertyName ); } } return null; } public String getTags() { return getStringProperty( PROPERTY_TAGS ); } public boolean isAdapterForType( Object type ) { return type != null && INodeAdapter.class == type; } public Boolean isSpeedFiltersEnabled() { return getBooleanProperty( PROPERTY_SPEED_FILTERS_ENABLED, true ); } public void load( InputStream source, boolean outOfSync ) throws CoreException { pluginPackageProperties.clear(); try { pluginPackageProperties.load( source ); flushProperties(); fireModelChanged( new ModelChangedEvent( this, IModelChangedEvent.WORLD_CHANGED, null, null ) ); } catch( ConfigurationException e ) { throw new CoreException( PortletCore.createErrorStatus( e ) ); } } public void removeDependency( String propertyName, String[] removedValues ) { String portalDependencies = pluginPackageProperties.getString( propertyName, null ); List<String> updatedValues = new ArrayList<String>(); String[] deps = portalDependencies.split( "," ); //$NON-NLS-1$ for( String dep : deps ) { if (dep.startsWith( "**/WEB-INF/lib/" )) { dep = dep.substring( dep.lastIndexOf( "/" ) + 1 ); } boolean shouldKeep = true; for( String removedValue : removedValues ) { if( dep.trim().equals( removedValue.trim() ) ) { shouldKeep = false; break; } } if( shouldKeep ) { updatedValues.add( dep ); } } if( updatedValues.size() > 0 ) { pluginPackageProperties.setProperty( propertyName, StringPool.EMPTY ); for( String updatedValue : updatedValues ) { addDependency( propertyName, updatedValue ); } } else { pluginPackageProperties.clearProperty( propertyName ); } flushProperties(); fireModelChanged( new ModelChangedEvent( this, IModelChangedEvent.REMOVE, updatedValues.toArray(), propertyName ) ); } public void removePortalDependencyJars( String[] removedJars ) { removeDependency( PROPERTY_PORTAL_DEPENDENCY_JARS, removedJars ); } public void removePortalDependencyTlds( String[] removedTlds ) { removeDependency( PROPERTY_PORTAL_DEPENDENCY_TLDS, removedTlds ); } public void removePortalDeployExcludeJar( String[] removedJars ) { removeDependency( PROPERTY_DEPLOY_EXCLUDE, removedJars ); } public void removeRequiredDeploymentContexts( String[] contexts ) { removeDependency( PROPERTY_REQUIRED_DEPLOYMENT_CONTEXTS, contexts ); } public void setAuthor( String author ) { setProperty( PROPERTY_AUTHOR, author ); } public void setChangeLog( String changeLog ) { setProperty( PROPERTY_CHANGE_LOG, changeLog ); } public void setLicenses( String licenses ) { setProperty( PROPERTY_LICENSES, licenses ); } public void setLiferayVersions( String liferayVersions ) { setProperty( PROPERTY_LIFERAY_VERSIONS, liferayVersions ); } public void setLongDescription( String desc ) { setProperty( PROPERTY_LONG_DESCRIPTION, desc ); } public void setModuleGroupId( String moduleGroupId ) { setProperty( PROPERTY_MODULE_GROUP_ID, moduleGroupId ); } public void setModuleIncrementalVersion( String moduleIncrementalVersion ) { setProperty( PROPERTY_MODULE_INCREMENTAL_VERSION, moduleIncrementalVersion ); } public void setName( String name ) { setProperty( PROPERTY_NAME, name ); } public void setPageUrl( String pageUrl ) { setProperty( PROPERTY_PAGE_URL, pageUrl ); } public void setProperty( String propertyName, Object propertyValue ) { Object oldValue = pluginPackageProperties.getProperty( propertyName ); pluginPackageProperties.setProperty( propertyName, propertyValue ); flushProperties(); fireModelChanged( new ModelChangedEvent( this, null, propertyName, oldValue, propertyValue ) ); } public void setShortDescription( String desc ) { setProperty( PROPERTY_SHORT_DESCRIPTION, desc ); } public void setSpeedFiltersEnabled( boolean enabled ) { Boolean oldValue = isSpeedFiltersEnabled(); pluginPackageProperties.setProperty( PROPERTY_SPEED_FILTERS_ENABLED, enabled ); flushProperties(); fireModelChanged( new ModelChangedEvent( this, null, PROPERTY_SPEED_FILTERS_ENABLED, oldValue, enabled ) ); } public void setTags( String tags ) { setProperty( PROPERTY_TAGS, tags ); } public void swapDependencies( String property, String dep1, String dep2 ) { String[] deps = null; String depsValue = pluginPackageProperties.getString( property, null ); if( depsValue != null ) { deps = depsValue.split( "," ); //$NON-NLS-1$ } else { deps = new String[0]; } ArrayList<String> list = new ArrayList<String>(); Collections.addAll( list, deps ); int index1 = list.indexOf( dep1 ); int index2 = list.indexOf( dep2 ); list.set( index2, dep1 ); list.set( index1, dep2 ); String[] newValues = list.toArray( new String[0] ); StringBuffer buffer = new StringBuffer(); for( String val : newValues ) { buffer.append( val + "," ); //$NON-NLS-1$ } String newValue = buffer.toString().substring( 0, buffer.length() - 1 ); pluginPackageProperties.setProperty( property, newValue ); flushProperties(); fireModelChanged( new ModelChangedEvent( this, null, property, depsValue, newValue ) ); } protected void flushProperties() { StringWriter output = new StringWriter(); try { pluginPackageProperties.save( output ); this.getDocument().set( output.toString() ); } catch( ConfigurationException e ) { } } }