blob: 05edd101ca87a9c3ee37d76ebabaa0c280c1514f [file] [log] [blame]
/*
* 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.netbeans.api.java.queries;
import java.io.File;
import java.io.FileOutputStream;
import java.net.URL;
import java.util.Arrays;
import java.util.Collections;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.concurrent.atomic.AtomicBoolean;
import java.util.zip.ZipEntry;
import java.util.zip.ZipOutputStream;
import javax.swing.event.ChangeEvent;
import javax.swing.event.ChangeListener;
import org.netbeans.api.java.queries.SourceForBinaryQuery.Result;
import org.netbeans.junit.MockServices;
import org.netbeans.junit.NbTestCase;
import org.netbeans.spi.java.queries.SourceForBinaryQueryImplementation;
import org.netbeans.spi.java.queries.SourceForBinaryQueryImplementation2;
import org.netbeans.spi.java.queries.support.SourceForBinaryQueryImpl2Base;
import org.openide.filesystems.FileObject;
import org.openide.filesystems.FileUtil;
import org.openide.util.ChangeSupport;
import org.openide.util.Utilities;
/**
*
* @author Tomas Zezula
*/
public class SourceForBinaryQueryTest extends NbTestCase {
public SourceForBinaryQueryTest (final String name) {
super (name);
}
private FileObject br1;
private FileObject br2;
private FileObject sr1;
private FileObject sr2;
private static final Map<URL,List<FileObject>> map = new HashMap<URL, List<FileObject>>();
@Override
protected void setUp() throws Exception {
this.clearWorkDir();
super.setUp();
File wd = this.getWorkDir();
FileObject wdfo = FileUtil.toFileObject(wd);
br1 = wdfo.createFolder("bin1");
br2 = wdfo.createFolder("bin2");
sr1 = wdfo.createFolder("src1");
File zf = new File (wd,"src2.zip");
ZipOutputStream zos = new ZipOutputStream (new FileOutputStream (zf));
zos.putNextEntry(new ZipEntry("foo.java"));
zos.closeEntry();
zos.close();
sr2 = FileUtil.getArchiveRoot(FileUtil.toFileObject(zf));
map.put(br1.toURL(), Collections.singletonList(sr1));
map.put(br2.toURL(), Collections.singletonList(sr2));
}
public void testSFBQImpl () throws Exception {
MockServices.setServices(LegacySFBQImpl.class);
SourceForBinaryQuery.Result2 res = SourceForBinaryQuery.findSourceRoots2(br1.toURL());
assertNotNull(res);
assertEquals(1, res.getRoots().length);
assertEquals(Collections.singletonList(sr1), Arrays.asList(res.getRoots()));
assertTrue(res.preferSources());
res = SourceForBinaryQuery.findSourceRoots2(br2.toURL());
assertNotNull(res);
assertEquals(1, res.getRoots().length);
assertEquals(Collections.singletonList(sr2), Arrays.asList(res.getRoots()));
assertFalse(res.preferSources());
res = SourceForBinaryQuery.findSourceRoots2(Utilities.toURI(getWorkDir()).toURL());
assertNotNull(res);
assertEquals(0, res.getRoots().length);
assertFalse(res.preferSources());
}
public void testSFBQImpl2 () throws Exception {
MockServices.setServices(LeafSFBQImpl.class);
SourceForBinaryQuery.Result2 res = SourceForBinaryQuery.findSourceRoots2(br1.toURL());
assertNotNull(res);
assertEquals(1, res.getRoots().length);
assertEquals(Collections.singletonList(sr1), Arrays.asList(res.getRoots()));
assertFalse(res.preferSources());
res = SourceForBinaryQuery.findSourceRoots2(br2.toURL());
assertNotNull(res);
assertEquals(1, res.getRoots().length);
assertEquals(Collections.singletonList(sr2), Arrays.asList(res.getRoots()));
assertTrue(res.preferSources());
res = SourceForBinaryQuery.findSourceRoots2(Utilities.toURI(getWorkDir()).toURL());
assertNotNull(res);
assertEquals(0, res.getRoots().length);
assertFalse(res.preferSources());
}
public void testSFBQDelegatingImpl () throws Exception {
DelegatingSFBImpl.impl = new LegacySFBQImpl();
MockServices.setServices(DelegatingSFBImpl.class);
SourceForBinaryQuery.Result2 res = SourceForBinaryQuery.findSourceRoots2(br1.toURL());
assertNotNull(res);
assertEquals(1, res.getRoots().length);
assertEquals(Collections.singletonList(sr1), Arrays.asList(res.getRoots()));
assertTrue(res.preferSources());
res = SourceForBinaryQuery.findSourceRoots2(br2.toURL());
assertNotNull(res);
assertEquals(1, res.getRoots().length);
assertEquals(Collections.singletonList(sr2), Arrays.asList(res.getRoots()));
assertFalse(res.preferSources());
res = SourceForBinaryQuery.findSourceRoots2(Utilities.toURI(getWorkDir()).toURL());
assertNotNull(res);
assertEquals(0, res.getRoots().length);
assertFalse(res.preferSources());
}
public void testSFBQDelegatingImpl2 () throws Exception {
DelegatingSFBImpl.impl = new LeafSFBQImpl();
MockServices.setServices(DelegatingSFBImpl.class);
SourceForBinaryQuery.Result2 res = SourceForBinaryQuery.findSourceRoots2(br1.toURL());
assertNotNull(res);
assertEquals(1, res.getRoots().length);
assertEquals(Collections.singletonList(sr1), Arrays.asList(res.getRoots()));
assertFalse(res.preferSources());
res = SourceForBinaryQuery.findSourceRoots2(br2.toURL());
assertNotNull(res);
assertEquals(1, res.getRoots().length);
assertEquals(Collections.singletonList(sr2), Arrays.asList(res.getRoots()));
assertTrue(res.preferSources());
res = SourceForBinaryQuery.findSourceRoots2(Utilities.toURI(getWorkDir()).toURL());
assertNotNull(res);
assertEquals(0, res.getRoots().length);
assertFalse(res.preferSources());
}
public void testListening () throws Exception {
DelegatingSFBImpl.impl = new LeafSFBQImpl();
MockServices.setServices(DelegatingSFBImpl.class);
SourceForBinaryQuery.Result2 res = SourceForBinaryQuery.findSourceRoots2(br1.toURL());
final AtomicBoolean fired = new AtomicBoolean ();
ChangeListener l;
res.addChangeListener( l = new ChangeListener() {
public void stateChanged(ChangeEvent e) {
fired.set(true);
}
});
LeafSFBQImpl.lastResult.fire();
res.removeChangeListener(l);
assertTrue(fired.get());
}
//Prefers sources for archives => behaves opposite to default
public static class LeafSFBQImpl implements SourceForBinaryQueryImplementation2 {
static R2 lastResult;
public Result findSourceRoots2(URL binaryRoot) {
lastResult = null;
List<FileObject> data = map.get(binaryRoot);
if (data != null) {
return lastResult = new R2(data.toArray(new FileObject[data.size()]), prefSources(data));
}
return null;
}
private static boolean prefSources(List<FileObject> l) {
for (FileObject f : l ) {
if (FileUtil.getArchiveFile(f) != null) {
return true;
}
}
return false;
}
public Result findSourceRoots(URL binaryRoot) {
return this.findSourceRoots2(binaryRoot);
}
}
public static class DelegatingSFBImpl extends SourceForBinaryQueryImpl2Base {
private static SourceForBinaryQueryImplementation impl;
public Result findSourceRoots2(URL binaryRoot) {
if (DelegatingSFBImpl.impl == null) {
throw new IllegalStateException ();
}
else if (DelegatingSFBImpl.impl instanceof SourceForBinaryQueryImplementation2) {
return ((SourceForBinaryQueryImplementation2)DelegatingSFBImpl.impl).findSourceRoots2(binaryRoot);
}
else {
final SourceForBinaryQuery.Result result = DelegatingSFBImpl.impl.findSourceRoots(binaryRoot);
return result == null ? null : asResult(result);
}
}
public Result findSourceRoots(URL binaryRoot) {
return this.findSourceRoots2(binaryRoot);
}
}
public static class LegacySFBQImpl implements SourceForBinaryQueryImplementation {
public Result findSourceRoots(URL binaryRoot) {
List<FileObject> data = map.get(binaryRoot);
if (data != null) {
return new R(data.toArray(new FileObject[data.size()]));
}
return null;
}
}
private static class R implements SourceForBinaryQuery.Result {
final FileObject[] roots;
private final ChangeSupport chs = new ChangeSupport(this);
public R (final FileObject[] roots) {
this.roots = roots;
}
public FileObject[] getRoots() {
return this.roots;
}
public void addChangeListener(ChangeListener l) {
chs.addChangeListener(l);
}
public void removeChangeListener(ChangeListener l) {
chs.removeChangeListener(l);
}
void fire () {
chs.fireChange();
}
}
private static class R2 extends R implements SourceForBinaryQueryImplementation2.Result {
final boolean ps;
public R2 (final FileObject[] roots, final boolean ps) {
super (roots);
this.ps = ps;
}
public boolean preferSources() {
return ps;
}
}
}