/**
* Copyright 2010 JBoss Inc
*
* Licensed 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.guvnor.tools;
import java.io.BufferedReader;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.net.URL;
import java.util.ArrayList;
import java.util.List;
import org.eclipse.core.runtime.IStatus;
import org.eclipse.core.runtime.Platform;
/**
* Reads and writes Guvnor location information to disk.
* @author jgraham
*/
public class GuvnorLocationManager {
private static final String REP_CACHE_NAME = ".replist"; //$NON-NLS-1$
private ArrayList<GuvnorRepository> repList = new ArrayList<GuvnorRepository>();
/*
* Package restricted
*/
GuvnorLocationManager() {
try {
load();
} catch (Exception e) {
Activator.getDefault().writeLog(IStatus.ERROR, e.getMessage(), e);
}
}
public void addRespository(String location) throws Exception {
addRepository(new GuvnorRepository(location));
}
public void addRepository(GuvnorRepository rep) throws Exception {
if (findRepository(rep.getLocation()) != null) {
throw new Exception("Duplicate repository: " + rep.getLocation()); //$NON-NLS-1$
}
repList.add(rep);
notifyListeners(IRepositorySetListener.REP_ADDED);
try {
commit();
} catch (Exception e) {
Activator.getDefault().displayError(IStatus.ERROR, e.getMessage(), e, true);
}
}
public List<GuvnorRepository> getRepositories() {
return repList;
}
public boolean removeRepository(String rep) {
boolean res = false;
try {
GuvnorRepository theRep = findRepository(rep);
if (theRep == null) {
return false;
}
res = repList.remove(theRep);
Platform.flushAuthorizationInfo(new URL(rep), "", "basic"); //$NON-NLS-1$ //$NON-NLS-2$
Activator.getLocationManager().removeRepository(theRep.getLocation());
notifyListeners(IRepositorySetListener.REP_ADDED);
commit();
} catch (Exception e) {
Activator.getDefault().displayError(IStatus.ERROR, e.getMessage(), e, true);
}
return res;
}
public GuvnorRepository findRepository(String rep) {
GuvnorRepository theRep = null;
for (int i = 0; i < repList.size(); i++) {
if (repList.get(i).getLocation().equals(rep)) {
theRep = repList.get(i);
break;
}
}
return theRep;
}
private void commit() throws Exception {
File repFile = Activator.getDefault().getStateLocation().
append(REP_CACHE_NAME).toFile();
FileOutputStream fos = null;
PrintWriter writer = null;
try {
fos = new FileOutputStream(repFile);
writer = new PrintWriter(fos);
for (int i = 0; i < repList.size(); i++) {
GuvnorRepository oneRep = repList.get(i);
writer.println(oneRep.getLocation());
}
writer.flush();
fos.flush();
} finally {
if (writer != null) {
writer.close();
}
if (fos != null) {
fos.close();
}
}
}
private void load() throws Exception {
repList.clear();
File repFile = Activator.getDefault().getStateLocation().
append(REP_CACHE_NAME).toFile();
if (!repFile.exists()) {
return;
}
FileInputStream fis = null;
BufferedReader reader = null;
try {
fis = new FileInputStream(repFile);
reader = new BufferedReader(new InputStreamReader(fis));
String oneRep = null;
do {
oneRep = reader.readLine();
if (oneRep != null && oneRep.trim().length() > 0) {
repList.add(new GuvnorRepository(oneRep));
}
} while (oneRep != null);
} finally {
if (fis != null) {
fis.close();
}
if (reader != null) {
reader.close();
}
}
}
public interface IRepositorySetListener {
public static final int REP_ADDED = 0;
public static final int REP_REMOVED = 1;
public void repositorySetChanged(int type, List<GuvnorRepository> repList);
}
private List<IRepositorySetListener> repsetListeners = new ArrayList<IRepositorySetListener>();
public boolean addRepositorySetListener(IRepositorySetListener listener) {
return repsetListeners.add(listener);
}
public boolean removeRepositorySetListener(IRepositorySetListener listener) {
return repsetListeners.remove(listener);
}
private void notifyListeners(int eventType) {
for (int i = 0; i < repsetListeners.size(); i++) {
try {
repsetListeners.get(i).repositorySetChanged(eventType, repList);
} catch (Throwable t) {
Activator.getDefault().writeLog(IStatus.ERROR, t.getMessage(), t);
}
}
}
}