blob: 9e40a8511aa4d8cc8a1729ba35024f555f0b157d [file] [log] [blame]
package org.jetbrains.android.database;
import com.intellij.database.dataSource.DataSourceTemplate;
import com.intellij.database.dataSource.LocalDataSource;
import com.intellij.database.model.info.DataSourceInfo;
import com.intellij.openapi.diagnostic.Logger;
import com.intellij.openapi.util.Comparing;
import com.intellij.openapi.util.ModificationTracker;
import com.intellij.openapi.util.io.FileUtil;
import com.intellij.persistence.database.DataSourceInfo;
import com.intellij.persistence.database.DataSourceTemplate;
import com.intellij.openapi.util.text.StringUtil;
import com.intellij.util.ui.classpath.SimpleClasspathElement;
import com.intellij.util.ui.classpath.SimpleClasspathElementFactory;
import com.intellij.util.xmlb.annotations.Tag;
import icons.AndroidIcons;
import org.jdom.Element;
import org.jetbrains.annotations.NotNull;
import javax.swing.*;
import java.io.IOException;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
/**
* @author Eugene.Kudelevsky
*/
class AndroidDataSource extends LocalDataSource implements DataSourceInfo, ModificationTracker {
private static final Logger LOG = Logger.getInstance("#org.jetbrains.android.database.AndroidDataSource");
private State myState = new State();
public AndroidDataSource() {
super("", "org.sqlite.JDBC", "", null, null);
}
@NotNull
public State getState() {
return myState;
}
@NotNull
public State buildFullState() {
myState.name = getName();
//myState.uuid = getUniqueId();
myState.classpathElements = serializeClasspathElements();
return myState;
}
public void loadState(@NotNull State state) {
myState = state;
setName(state.name);
// todo persist uuid must be preserved between sessions
//setUniqueId(state.uuid);
setClasspathElements(deserializeClasspathElements());
resetUrl();
}
@NotNull
private Element[] serializeClasspathElements() {
final List<SimpleClasspathElement> elements = getClasspathElements();
if (elements.isEmpty()) {
return new Element[0];
}
final Element[] serializedElements = new Element[elements.size()];
int i = 0;
for (SimpleClasspathElement element : elements) {
final Element serializedElement = new Element("element");
try {
element.serialize(serializedElement);
}
catch (IOException e) {
LOG.warn(e);
}
serializedElements[i++] = serializedElement;
}
return serializedElements;
}
@NotNull
private List<SimpleClasspathElement> deserializeClasspathElements() {
final Element[] serializedElements = myState.classpathElements;
if (serializedElements == null || serializedElements.length == 0) {
return Collections.emptyList();
}
final List<SimpleClasspathElement> elements = new ArrayList<SimpleClasspathElement>(serializedElements.length);
for (Element serializedElement : serializedElements) {
elements.addAll(SimpleClasspathElementFactory.createElements(null, serializedElement));
}
return elements;
}
void resetUrl() {
setUrl(buildUrl());
}
@NotNull
public String buildUrl() {
String path = buildLocalDbFileOsPath();
return StringUtil.isEmpty(path) ? "" : "jdbc:sqlite:" + FileUtil.toSystemDependentName(FileUtil.toCanonicalPath(path));
}
@NotNull
public String buildLocalDbFileOsPath() {
final State state = getState();
return AndroidRemoteDataBaseManager.buildLocalDbFileOsPath(
state.deviceId, state.packageName, state.databaseName, state.external);
}
@Override
public long getModificationCount() {
return 0;
}
@NotNull
public AndroidDataSource copy() {
AndroidDataSource newSource = new AndroidDataSource();
newSource.setName(getName());
State newState = newSource.getState();
State state = buildFullState();
newState.name = state.name;
newState.deviceId = state.deviceId;
newState.packageName = state.packageName;
newState.databaseName = state.databaseName;
newState.external = state.external;
newState.classpathElements = cloneElementsArray(state.classpathElements);
newSource.resetUrl();
return newSource;
}
@NotNull
private static Element[] cloneElementsArray(@NotNull Element[] list) {
final Element[] copy = new Element[list.length];
for (int i = 0; i < list.length; i++) {
copy[i] = list[i].clone();
}
return copy;
}
@Override
public Icon getBaseIcon() {
return AndroidIcons.Android;
}
@Override
public DataSourceTemplate getTemplate() {
return AndroidDbManager.DEFAULT_TEMPLATE;
}
@Override
public boolean equalConfiguration(@NotNull LocalDataSource o) {
if (!(o instanceof AndroidDataSource)) return super.equalConfiguration(o);
State s = ((AndroidDataSource)o).getState();
if (!Comparing.equal(myState.deviceId, s.deviceId)) return false;
if (!Comparing.equal(myState.packageName, s.packageName)) return false;
if (!Comparing.equal(myState.databaseName, s.databaseName)) return false;
if (!Comparing.equal(myState.external, s.external)) return false;
if (!Comparing.equal(myState.external, s.external)) return false;
return true;
}
@Tag("data-source")
public static class State {
//@Attribute
//public String uuid = "";
public String deviceId = "";
public String name = "";
public String packageName = "";
public String databaseName = "";
public boolean external = false;
@Tag("classpath-elements")
public Element[] classpathElements = new Element[0];
}
}