/******************************************************************************* * 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.xml.search.ui; import com.liferay.ide.core.ILiferayProject; import com.liferay.ide.core.LiferayCore; import com.liferay.ide.core.util.CoreUtil; import com.liferay.ide.portlet.core.dd.PortletDescriptorHelper; import java.io.ByteArrayInputStream; import java.net.URL; import org.eclipse.core.resources.IFile; import org.eclipse.core.resources.IFolder; import org.eclipse.core.resources.IMarker; import org.eclipse.core.resources.IProject; import org.eclipse.core.resources.IResource; import org.eclipse.core.runtime.NullProgressMonitor; import org.eclipse.jface.resource.ImageDescriptor; import org.eclipse.swt.graphics.Image; /** * @author Terry Jia */ public class AddResourceBundleFileMarkerResolution extends AbstractResourceBundleMarkerResolution { private String resourceBundlePackage = "content"; private String resourceBundleName = "Language"; private String portletName = ""; public AddResourceBundleFileMarkerResolution( IMarker marker, String portletName ) { super( marker ); this.portletName = portletName; } private void checkResourceBundleElement( IProject project ) { PortletDescriptorHelper portletDescriptorHelper = new PortletDescriptorHelper( project ); String[] resouceBundles = portletDescriptorHelper.getAllResourceBundles(); if( resouceBundles.length == 0 ) { portletDescriptorHelper.addResourceBundle( resourceBundlePackage + "." + resourceBundleName, portletName ); } else { for( String resouceBundle : resouceBundles ) { if( !CoreUtil.isNullOrEmpty( resouceBundle ) ) { String[] paths = resouceBundle.split( "\\." ); if( paths.length > 2 ) { StringBuffer sb = new StringBuffer(); for( int i = 0; i < ( paths.length - 1 ); i++ ) { sb.append( paths[i] ); sb.append( "/" ); } resourceBundlePackage = sb.toString(); resourceBundleName = paths[paths.length - 1]; } else if( paths.length == 2 ) { resourceBundlePackage = paths[0]; resourceBundleName = paths[1]; } else if( paths.length == 1 ) { resourceBundlePackage = ""; resourceBundleName = paths[0]; } break; } } } } @Override public String getLabel() { return "Create a new default resource bundle add it to " + portletName + " portlet"; } public Image getImage() { final URL url = LiferayXMLSearchUI.getDefault().getBundle().getEntry( "/icons/resource-bundle-new.png" ); return ImageDescriptor.createFromURL( url ).createImage(); } @Override protected void resolve( IMarker marker ) { final IProject project = marker.getResource().getProject(); if( getResourceKey(marker) == null || project == null ) { return; } try { checkResourceBundleElement( project ); final ILiferayProject liferayProject = LiferayCore.create( project ); if( liferayProject == null ) { return; } final IFolder folder = liferayProject.getSourceFolder( "resources" ).getFolder( resourceBundlePackage ); if( !folder.exists() ) { CoreUtil.makeFolders( folder ); } final IFile resourceBundle = folder.getFile( resourceBundleName + ".properties" ); String resourceKey = getResourceKey( marker ); if( CoreUtil.isNullOrEmpty( resourceKey ) ) { return; } String resourceValue = getDefaultResourceValue( resourceKey ); String resourcePropertyLine = resourceKey + "=" + resourceValue + "\n"; int contentOffset = 0; int resourcePropertyLineOffset = resourcePropertyLine.getBytes().length; if( !resourceBundle.exists() ) { IFolder parent = (IFolder) resourceBundle.getParent(); CoreUtil.prepareFolder( parent ); resourceBundle.create( new ByteArrayInputStream( resourcePropertyLine.getBytes( "UTF-8" ) ), IResource.FORCE, null ); contentOffset = resourcePropertyLineOffset; } else { String contents = CoreUtil.readStreamToString( resourceBundle.getContents() ); StringBuffer sb = new StringBuffer(); sb.append( contents ); sb.append( resourcePropertyLine ); byte[] bytes = sb.toString().trim().getBytes( "UTF-8" ); contentOffset = bytes.length; resourceBundle.setContents( new ByteArrayInputStream( bytes ), IResource.FORCE, new NullProgressMonitor() ); } openEditor( resourceBundle, contentOffset - resourcePropertyLineOffset, contentOffset - 1 ); } catch( Exception e ) { LiferayXMLSearchUI.logError( e ); } } }