/******************************************************************************* * 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.sdk.core; import com.liferay.ide.core.LiferayCore; import com.liferay.ide.core.util.CoreUtil; import java.io.ByteArrayInputStream; import java.io.InputStreamReader; import java.io.StringWriter; import java.util.ArrayList; import java.util.List; import org.eclipse.core.runtime.IPath; import org.eclipse.core.runtime.preferences.IEclipsePreferences; import org.eclipse.core.runtime.preferences.InstanceScope; import org.eclipse.debug.internal.core.XMLMemento; import org.osgi.framework.Version; /** * @author Greg Amerson */ @SuppressWarnings( "restriction" ) public final class SDKManager { private static final byte EVENT_ADDED = 0; private static final byte EVENT_CHANGED = 1; private static final byte EVENT_REMOVED = 2; private static SDKManager instance; public static SDKManager getInstance() { if( instance == null ) { instance = new SDKManager(); } return instance; } public static Version getLeastValidVersion() { return ISDKConstants.LEAST_SUPPORTED_SDK_VERSION; } private boolean initialized = false; // current list of available sdks private List<SDK> sdkList; protected List<ISDKListener> sdkListeners = new ArrayList<ISDKListener>(3); private SDKManager() { instance = this; } public synchronized void addSDK( SDK sdk ) { if( sdk == null ) { throw new IllegalArgumentException( "sdk cannot be null" ); } if( !initialized ) { initialize(); } if( !containsSDK( sdk ) ) { sdkList.add( sdk ); } if( sdkList.size() == 1 ) { sdk.setDefault( true ); } saveSDKs(); fireSDKEvent( new SDK[] { sdk }, EVENT_ADDED ); } public void addSDKListener( ISDKListener listener ) { synchronized ( sdkListeners ) { sdkListeners.add( listener ); } } public synchronized void clearSDKs() { this.sdkList.clear(); saveSDKs(); fireSDKEvent( new SDK[] {}, EVENT_REMOVED ); } public boolean containsSDK( SDK theSDK ) { if( theSDK != null && getSDKs().length > 0 ) { for( SDK sdk : getSDKs() ) { if( theSDK.getName().equals( sdk.getName() ) && theSDK.getLocation().equals( sdk.getLocation() ) ) { return true; } } } return false; } private void fireSDKEvent( SDK[] sdks, byte event ) { if( !sdkListeners.isEmpty() ) { List<ISDKListener> clone = new ArrayList<ISDKListener>(); clone.addAll( sdkListeners ); for( ISDKListener listener : clone ) { try { if( event == EVENT_ADDED ) { listener.sdksAdded( sdks ); } else if( event == EVENT_CHANGED ) { listener.sdksChanged( sdks ); } else if( event == EVENT_REMOVED ) { listener.sdksRemoved( sdks ); } } catch( Exception e ) { SDKCorePlugin.logError( "error in sdk listener.", e ); //$NON-NLS-1$ } } } } public SDK getDefaultSDK() { for( SDK sdk : getSDKs() ) { if( sdk.isDefault() ) { return sdk; } } return null; } @SuppressWarnings( "deprecation" ) private IEclipsePreferences getPrefs() { return new InstanceScope().getNode( SDKCorePlugin.PREFERENCE_ID ); } public SDK getSDK( IPath sdkLocation ) { for( SDK sdk : getSDKs() ) { if( sdk.getLocation().equals( sdkLocation ) ) { return sdk; } } return null; } public SDK getSDK( String sdkName ) { if( sdkName == null ) { return null; } for( SDK sdk : getSDKs() ) { if( sdkName.equals( sdk.getName() ) ) { return sdk; } } return null; } public synchronized SDK[] getSDKs() { if( !initialized ) { initialize(); } return sdkList.toArray( new SDK[0] ); } private void initialize() { loadSDKs(); initialized = true; } private void loadSDKs() { sdkList = new ArrayList<SDK>(); IEclipsePreferences prefs = getPrefs(); String sdksXmlString = prefs.get( "sdks" , null ); //$NON-NLS-1$ if( !CoreUtil.isNullOrEmpty( sdksXmlString ) ) { try { XMLMemento root = XMLMemento.createReadRoot( new InputStreamReader( new ByteArrayInputStream( sdksXmlString.getBytes( "UTF-8" ) ), "UTF-8" ) ); //$NON-NLS-1$ String defaultSDKName = root.getString( "default" ); //$NON-NLS-1$ XMLMemento[] children = root.getChildren( "sdk" ); //$NON-NLS-1$ SDK defaultSDK = null; for( XMLMemento sdkElement : children ) { SDK sdk = new SDK(); sdk.loadFromMemento( sdkElement ); boolean def = sdk.getName() != null && sdk.getName().equals( defaultSDKName ) && defaultSDK == null; if( def ) { sdk.setDefault( def ); defaultSDK = sdk; } sdkList.add( sdk ); } } catch( Exception e ) { SDKCorePlugin.logError( e ); } } } public void removeSDKListener( ISDKListener listener ) { synchronized ( sdkListeners ) { sdkListeners.remove( listener ); } } private void saveSDKs() { XMLMemento root = XMLMemento.createWriteRoot( "sdks" ); //$NON-NLS-1$ for( SDK sdk : sdkList ) { XMLMemento child = root.createChild( "sdk" ); //$NON-NLS-1$ sdk.saveToMemento( child ); if( sdk.isDefault() ) { root.putString( "default", sdk.getName() ); //$NON-NLS-1$ } } try { StringWriter writer = new StringWriter(); root.save( writer ); getPrefs().put( "sdks", writer.toString() ); //$NON-NLS-1$ getPrefs().flush(); } catch( Exception e ) { LiferayCore.logError( e ); } } public synchronized void setSDKs( SDK[] sdks ) { if( CoreUtil.isNullOrEmpty( sdks ) ) { throw new IllegalArgumentException( "sdk array cannot be null or empty" ); } if( CoreUtil.containsNullElement( sdks ) ) { throw new IllegalArgumentException( "sdk array contains null element" ); } this.sdkList.clear(); for( SDK sdk : sdks ) { sdkList.add( sdk ); } saveSDKs(); fireSDKEvent( sdks, EVENT_CHANGED ); } }