Skip to content

Commit 3a14509

Browse files
committed
add tests + cleaning
1 parent 2b7c080 commit 3a14509

File tree

24 files changed

+265
-307
lines changed

24 files changed

+265
-307
lines changed

core.loaders/maven/src/main/java/net/lecousin/core/loaders/maven/MavenPOM.java

Lines changed: 11 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -694,54 +694,39 @@ private Repository readRepository(XMLStreamReader xml) throws MavenPOMException,
694694
} else if (xml.event.text.equals("url")) {
695695
repo.url = xml.readInnerText().trim().asString();
696696
} else if (xml.event.text.equals("releases")) {
697-
readRepositoryReleases(xml, ctx, repo);
697+
readRepositoryType(xml, ctx, repo, true);
698698
} else if (xml.event.text.equals("snapshots")) {
699-
readRepositorySnapshots(xml, ctx, repo);
699+
readRepositoryType(xml, ctx, repo, false);
700700
} else {
701701
xml.closeElement();
702702
}
703703
} while (true);
704704
return repo;
705705
}
706706

707-
private void readRepositoryReleases(XMLStreamReader xml, ElementContext ctx, Repository repo)
708-
throws XMLException, MavenPOMException, IOException {
709-
if (xml.event.isClosed)
710-
return;
711-
do {
712-
if (!xml.nextInnerElement(ctx)) {
713-
if (!Type.END_ELEMENT.equals(xml.event.type))
714-
throw new MavenPOMException(pomFile,
715-
"Invalid POM: missing closing releases tag");
716-
break;
717-
}
718-
if (xml.event.text.equals("enabled")) {
719-
String s = xml.readInnerText().trim().asString();
720-
if (s.equalsIgnoreCase("false"))
721-
repo.releasesEnabled = false;
722-
}
723-
} while (true);
724-
}
725-
726-
private void readRepositorySnapshots(XMLStreamReader xml, ElementContext ctx, Repository repo)
707+
private void readRepositoryType(XMLStreamReader xml, ElementContext ctx, Repository repo, boolean isReleases)
727708
throws XMLException, MavenPOMException, IOException {
728709
if (xml.event.isClosed) return;
729710
do {
730711
if (!xml.nextInnerElement(ctx)) {
731712
if (!Type.END_ELEMENT.equals(xml.event.type))
732713
throw new MavenPOMException(pomFile,
733-
"Invalid POM: missing closing snapshots tag");
714+
"Invalid POM: missing closing " + (isReleases ? "releases" : "snapshots") + " tag");
734715
break;
735716
}
736717
if (xml.event.text.equals("enabled")) {
737718
String s = xml.readInnerText().trim().asString();
738-
if (s.equalsIgnoreCase("false"))
739-
repo.snapshotsEnabled = false;
719+
if (s.equalsIgnoreCase("false")) {
720+
if (isReleases)
721+
repo.releasesEnabled = false;
722+
else
723+
repo.snapshotsEnabled = false;
724+
}
740725
}
741726
} while (true);
742727
}
743728
}
744-
729+
745730
private class Finalize extends Task.Cpu<Void, NoException> {
746731
public Finalize(AsyncSupplier<MavenPOM, LibraryManagementException> result, byte priority) {
747732
super("Finalize POM loading", priority);

core.loaders/maven/src/test/java/net/lecousin/core/loaders/maven/tests/TestRemoteRepository.java

Lines changed: 34 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
package net.lecousin.core.loaders.maven.tests;
22

33
import java.io.File;
4+
import java.net.URI;
45
import java.util.ArrayList;
56
import java.util.List;
67
import java.util.zip.ZipFile;
@@ -16,6 +17,10 @@
1617
import net.lecousin.framework.application.libraries.artifacts.LibraryDescriptor.Dependency;
1718
import net.lecousin.framework.concurrent.Task;
1819
import net.lecousin.framework.core.test.LCCoreAbstractTest;
20+
import net.lecousin.framework.io.FileIO;
21+
import net.lecousin.framework.io.IOUtil;
22+
import net.lecousin.framework.io.provider.IOProvider;
23+
import net.lecousin.framework.io.provider.IOProviderFromURI;
1924

2025
import org.junit.Assert;
2126
import org.junit.Test;
@@ -192,5 +197,34 @@ public void testLoadFile() throws Exception {
192197
Assert.assertNull(repo.loadFileSync("junit", "junit", junit.runner.Version.id(), null, "test-jar"));
193198
Assert.assertNull(repo.loadFile("junit", "junit", junit.runner.Version.id(), null, "test-jar", Task.PRIORITY_NORMAL).blockResult(30000));
194199
}
200+
201+
@Test
202+
public void testErrors() throws Exception {
203+
File dir = new File("./target/test-remote");
204+
dir.mkdirs();
205+
testMetaDataError(dir, "error1", "not-metadata");
206+
testMetaDataError(dir, "error1", "empty");
207+
}
208+
209+
private static void testMetaDataError(File repoDir, String groupId, String testName) throws Exception {
210+
File dir = new File(repoDir + "/" + groupId + "/" + testName);
211+
dir.mkdirs();
212+
File outFile = new File(dir, "maven-metadata.xml");
213+
outFile.createNewFile();
214+
outFile.deleteOnExit();
215+
try {
216+
FileIO.WriteOnly out = new FileIO.WriteOnly(outFile, Task.PRIORITY_NORMAL);
217+
IOUtil.copy(
218+
((IOProvider.Readable)IOProviderFromURI.getInstance().get(new URI("classpath:test-maven/remote/error/" + testName + ".maven-metadata.xml"))).provideIOReadable(Task.PRIORITY_NORMAL),
219+
out,
220+
-1, true, null, 0).blockThrow(15000);
221+
222+
MavenRemoteRepository repo = new MavenRemoteRepository(repoDir.toURI().toString(), true, true);
223+
List<String> versions = repo.getAvailableVersions(groupId, testName, Task.PRIORITY_NORMAL).blockResult(0);
224+
Assert.assertNull(versions);
225+
} finally {
226+
outFile.delete();
227+
}
228+
}
195229

196230
}

core.loaders/maven/src/test/resources/test-maven/remote/error/empty.maven-metadata.xml

Whitespace-only changes.
Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
<hello>
2+
<world/>
3+
</hello>

core.loaders/maven/src/test/resources/test-maven/settings.xml

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,4 @@
1+
<!-- we can have a comment at the beginning -->
12
<settings xmlns="http://maven.apache.org/SETTINGS/1.0.0"
23
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
34
xsi:schemaLocation="http://maven.apache.org/SETTINGS/1.0.0
@@ -20,4 +21,9 @@
2021
</activation>
2122
</profile>
2223
</profiles>
23-
</settings>
24+
25+
<activeProfiles>
26+
<unknown/>
27+
</activeProfiles>
28+
</settings>
29+
<!-- we can have a comment at the end -->

net.lecousin.core/src/main/java/net/lecousin/framework/application/SplashScreen.java

Lines changed: 15 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -168,22 +168,11 @@ public void run() {
168168
}
169169

170170
private void loadPoweredBy() {
171-
int pos = 0;
172-
int size = 4363;
173-
byte[] buffer = new byte[size];
174-
try (InputStream in = getClass().getClassLoader().getResourceAsStream("net/lecousin/framework/core/logo_110x40.png")) {
175-
do {
176-
int nb = in.read(buffer, pos, size - pos);
177-
if (nb <= 0) break;
178-
pos += nb;
179-
} while (pos < size);
180-
} catch (IOException e) {
181-
// ignore, no logo
182-
}
183-
if (pos == size) {
171+
ImageIcon image = loadImage("logo_110x40.png", 4363);
172+
if (image != null) {
184173
synchronized (SplashScreen.this) {
185174
if (win != null)
186-
poweredBy = new ImageIcon(buffer);
175+
poweredBy = image;
187176
}
188177
}
189178
}
@@ -263,13 +252,11 @@ public synchronized void setLogo(ImageIcon logo, boolean isCustom) {
263252
this.isCustomLogo = isCustom;
264253
update();
265254
}
266-
267-
/** Load the default logo. */
268-
public void loadDefaultLogo() {
255+
256+
private ImageIcon loadImage(String filename, int size) {
269257
int pos = 0;
270-
int size = 18296;
271258
byte[] buffer = new byte[size];
272-
try (InputStream in = getClass().getClassLoader().getResourceAsStream("net/lecousin/framework/core/logo_200x200.png")) {
259+
try (InputStream in = getClass().getClassLoader().getResourceAsStream("net/lecousin/framework/core/" + filename)) {
273260
do {
274261
int nb = in.read(buffer, pos, size - pos);
275262
if (nb <= 0) break;
@@ -279,7 +266,15 @@ public void loadDefaultLogo() {
279266
// ignore, no logo
280267
}
281268
if (pos == size)
282-
setLogo(new ImageIcon(buffer), false);
269+
return new ImageIcon(buffer);
270+
return null;
271+
}
272+
273+
/** Load the default logo. */
274+
public void loadDefaultLogo() {
275+
ImageIcon image = loadImage("logo_200x200.png", 18296);
276+
if (image != null)
277+
setLogo(image, false);
283278
}
284279

285280
/** Show application name. */

net.lecousin.core/src/main/java/net/lecousin/framework/collections/LinkedArrayList.java

Lines changed: 2 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -232,18 +232,7 @@ public boolean containsAll(Collection<?> c) {
232232

233233
@Override
234234
public T get(int index) {
235-
if (head == null) throw new IndexOutOfBoundsException(Integer.toString(index));
236-
if (index < 0) throw new IndexOutOfBoundsException(Integer.toString(index));
237-
Array<T> a = head;
238-
int i = 0;
239-
while (i + a.size <= index && a.next != null) {
240-
i += a.size;
241-
a = a.next;
242-
}
243-
i = index - i;
244-
if (i >= a.size)
245-
throw new IndexOutOfBoundsException(Integer.toString(index));
246-
return a.elements[i];
235+
return getlong(index);
247236
}
248237

249238
/** Get an element using a long index. */
@@ -300,20 +289,7 @@ private void shiftLeft(Array<T> a, int i) {
300289

301290
@Override
302291
public T remove(int index) {
303-
if (head == null) throw new IndexOutOfBoundsException(Integer.toString(index));
304-
if (index < 0) throw new IndexOutOfBoundsException(Integer.toString(index));
305-
Array<T> a = head;
306-
int i = 0;
307-
while (i + a.size <= index && a.next != null) {
308-
i += a.size;
309-
a = a.next;
310-
}
311-
i = index - i;
312-
if (i >= a.size) throw new IndexOutOfBoundsException(Integer.toString(index));
313-
T element = a.elements[i];
314-
shiftLeft(a, i);
315-
size--;
316-
return element;
292+
return removelong(index);
317293
}
318294

319295
@Override
Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,29 @@
1+
package net.lecousin.framework.event;
2+
3+
import java.util.ArrayList;
4+
import java.util.function.Consumer;
5+
6+
/** Abstract class implementing Listenable, containing 2 lists of listeners.
7+
* @param <T> type of event
8+
*/
9+
public abstract class AbstractListenable<T> extends AbstractSimpleListenable implements Listenable<T> {
10+
11+
protected ArrayList<Consumer<T>> listenersConsumer = null;
12+
13+
@Override
14+
public synchronized void addListener(Consumer<T> listener) {
15+
if (listenersConsumer == null) listenersConsumer = new ArrayList<>(5);
16+
listenersConsumer.add(listener);
17+
}
18+
19+
@Override
20+
public synchronized void removeListener(Consumer<T> listener) {
21+
if (listenersConsumer == null) return;
22+
listenersConsumer.remove(listener);
23+
if (listenersConsumer.isEmpty()) listenersConsumer = null;
24+
}
25+
26+
@Override
27+
public boolean hasListeners() { return listenersConsumer != null || listenersRunnable != null; }
28+
29+
}
Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,26 @@
1+
package net.lecousin.framework.event;
2+
3+
import java.util.ArrayList;
4+
5+
/** Abstract class implementaing SimpleListenable, containing a list of listeners. */
6+
public abstract class AbstractSimpleListenable implements SimpleListenable {
7+
8+
protected ArrayList<Runnable> listenersRunnable = null;
9+
10+
@Override
11+
public synchronized void addListener(Runnable listener) {
12+
if (listenersRunnable == null) listenersRunnable = new ArrayList<>(5);
13+
listenersRunnable.add(listener);
14+
}
15+
16+
@Override
17+
public synchronized void removeListener(Runnable listener) {
18+
if (listenersRunnable == null) return;
19+
listenersRunnable.remove(listener);
20+
if (listenersRunnable.isEmpty()) listenersRunnable = null;
21+
}
22+
23+
@Override
24+
public boolean hasListeners() { return listenersRunnable != null; }
25+
26+
}

net.lecousin.core/src/main/java/net/lecousin/framework/event/Event.java

Lines changed: 3 additions & 35 deletions
Original file line numberDiff line numberDiff line change
@@ -9,47 +9,15 @@
99
* An event allows to call listeners that previously registered themselves when the event is fired.
1010
* @param <T> type of data fired with the event
1111
*/
12-
public class Event<T> implements Listenable<T> {
12+
public class Event<T> extends AbstractListenable<T> {
1313

14-
private ArrayList<Consumer<T>> listeners = null;
15-
private ArrayList<Runnable> listenersRunnable = null;
16-
17-
@Override
18-
public synchronized void addListener(Consumer<T> listener) {
19-
if (listeners == null) listeners = new ArrayList<>(5);
20-
listeners.add(listener);
21-
}
22-
23-
@Override
24-
public synchronized void addListener(Runnable listener) {
25-
if (listenersRunnable == null) listenersRunnable = new ArrayList<>(5);
26-
listenersRunnable.add(listener);
27-
}
28-
29-
@Override
30-
public synchronized void removeListener(Consumer<T> listener) {
31-
if (listeners == null) return;
32-
listeners.remove(listener);
33-
if (listeners.isEmpty()) listeners = null;
34-
}
35-
36-
@Override
37-
public synchronized void removeListener(Runnable listener) {
38-
if (listenersRunnable == null) return;
39-
listenersRunnable.remove(listener);
40-
if (listenersRunnable.isEmpty()) listenersRunnable = null;
41-
}
42-
43-
@Override
44-
public boolean hasListeners() { return listeners != null || listenersRunnable != null; }
45-
4614
/** Fire the event (call the listeners). */
4715
public void fire(T event) {
4816
ArrayList<Consumer<T>> list1;
4917
ArrayList<Runnable> list2;
5018
synchronized (this) {
51-
if (listeners == null) list1 = null;
52-
else list1 = new ArrayList<>(listeners);
19+
if (listenersConsumer == null) list1 = null;
20+
else list1 = new ArrayList<>(listenersConsumer);
5321
if (listenersRunnable == null) list2 = null;
5422
else list2 = new ArrayList<>(listenersRunnable);
5523
}

0 commit comments

Comments
 (0)