/*
* Licensed to the Apache Software Foundation (ASF) under one or more
* contributor license agreements. See the NOTICE file distributed with
* this work for additional information regarding copyright ownership.
* The ASF licenses this file to You under the Apache License, Version 2.0
* (the "License"); you may not use this file except in compliance with
* the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*
*/
package org.apache.ivyde.internal.eclipse.retrieve;
import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import java.util.Map.Entry;
import org.apache.ivyde.internal.eclipse.IvyPlugin;
import org.eclipse.core.resources.IProject;
import org.eclipse.core.resources.ISaveContext;
import org.eclipse.core.resources.ISaveParticipant;
import org.eclipse.core.resources.ProjectScope;
import org.eclipse.core.runtime.CoreException;
import org.eclipse.core.runtime.preferences.IEclipsePreferences;
import org.eclipse.core.runtime.preferences.IScopeContext;
import org.osgi.service.prefs.BackingStoreException;
public class RetrieveSetupManager implements ISaveParticipant {
private static final String PREF_ID = "org.apache.ivyde.eclipse.standaloneretrieve";
private Map/* <IProject, IEclipsePreferences> */projectPrefs = new HashMap();
public List/* <StandaloneRetrieveSetup> */getSetup(IProject project) throws IOException {
IEclipsePreferences pref;
synchronized (projectPrefs) {
pref = (IEclipsePreferences) projectPrefs.get(project);
}
if (pref == null) {
IScopeContext projectScope = new ProjectScope(project);
pref = projectScope.getNode(IvyPlugin.ID);
}
String retrieveSetup = pref.get(PREF_ID, null);
if (retrieveSetup == null) {
return new ArrayList();
}
List/* <StandaloneRetrieveSetup> */retrieveSetups;
StandaloneRetrieveSerializer serializer = new StandaloneRetrieveSerializer();
ByteArrayInputStream in = new ByteArrayInputStream(retrieveSetup.getBytes());
try {
retrieveSetups = serializer.read(in, project);
} finally {
try {
in.close();
} catch (IOException e) {
// we don't care
}
}
return retrieveSetups;
}
public void save(final IProject project, List/* <StandaloneRetrieveSetup> */retrieveSetups)
throws IOException {
StandaloneRetrieveSerializer serializer = new StandaloneRetrieveSerializer();
ByteArrayOutputStream out = new ByteArrayOutputStream();
try {
serializer.write(out, retrieveSetups);
} finally {
try {
out.close();
} catch (IOException e) {
// we don't care
}
}
final String retrieveSetup = new String(out.toByteArray());
synchronized (projectPrefs) {
IEclipsePreferences pref = (IEclipsePreferences) projectPrefs.get(project);
if (pref == null) {
IScopeContext projectScope = new ProjectScope(project);
pref = projectScope.getNode(IvyPlugin.ID);
projectPrefs.put(project, pref);
}
pref.put(PREF_ID, retrieveSetup);
}
}
public void prepareToSave(ISaveContext context) throws CoreException {
// nothing to do
}
public void saving(ISaveContext context) throws CoreException {
Map toFlush = new HashMap();
synchronized (projectPrefs) {
toFlush.putAll(projectPrefs);
projectPrefs.clear();
}
Iterator itPrefs = toFlush.entrySet().iterator();
while (itPrefs.hasNext()) {
Entry entry = (Entry) itPrefs.next();
try {
((IEclipsePreferences) entry.getValue()).flush();
} catch (BackingStoreException e) {
IvyPlugin.logError("Failed to save the state of the Ivy preferences of "
+ ((IProject) entry.getKey()).getName(), e);
}
}
}
public void rollback(ISaveContext context) {
// nothing to do
}
public void doneSaving(ISaveContext context) {
// nothing to do
}
}