Skip to content

Commit

Permalink
Improved management of manageables (introducing group kind).
Browse files Browse the repository at this point in the history
  • Loading branch information
nmihajlovski committed Mar 13, 2017
1 parent 6cbae35 commit 94a05b0
Show file tree
Hide file tree
Showing 16 changed files with 96 additions and 39 deletions.
Expand Up @@ -4,6 +4,7 @@
import org.rapidoid.annotation.Since; import org.rapidoid.annotation.Since;
import org.rapidoid.group.Action; import org.rapidoid.group.Action;
import org.rapidoid.group.AutoManageable; import org.rapidoid.group.AutoManageable;
import org.rapidoid.group.ManageableBean;
import org.rapidoid.u.U; import org.rapidoid.u.U;


import java.util.List; import java.util.List;
Expand All @@ -30,6 +31,7 @@


@Authors("Nikolche Mihajlovski") @Authors("Nikolche Mihajlovski")
@Since("5.3.0") @Since("5.3.0")
@ManageableBean(kind = "cache")
public class ManageableCache extends AutoManageable<ManageableCache> { public class ManageableCache extends AutoManageable<ManageableCache> {


private final ConcurrentCache<?, ?> cache; private final ConcurrentCache<?, ?> cache;
Expand All @@ -44,11 +46,6 @@ public List<String> getManageableProperties() {
return U.list("id", "size", "capacity", "hitRate", "hits", "misses", "bypassed", "errors", "ttl"); return U.list("id", "size", "capacity", "hitRate", "hits", "misses", "bypassed", "errors", "ttl");
} }


@Override
public String getManageableType() {
return "Cache";
}

@Action(name = "!purge") @Action(name = "!purge")
public void purge() { public void purge() {
cache.clear(); cache.clear();
Expand Down
Expand Up @@ -86,9 +86,4 @@ protected Object doManageableAction(String action) {
throw U.rte("Cannot handle action '%s'!", action); throw U.rte("Cannot handle action '%s'!", action);
} }


@Override
public String getManageableType() {
return getClass().getSimpleName();
}

} }
Expand Up @@ -24,6 +24,7 @@
import org.rapidoid.annotation.Since; import org.rapidoid.annotation.Since;
import org.rapidoid.collection.Coll; import org.rapidoid.collection.Coll;
import org.rapidoid.lambda.Mapper; import org.rapidoid.lambda.Mapper;
import org.rapidoid.u.U;


import java.util.Map; import java.util.Map;
import java.util.UUID; import java.util.UUID;
Expand Down
13 changes: 13 additions & 0 deletions rapidoid-commons/src/main/java/org/rapidoid/group/GroupOf.java
Expand Up @@ -33,6 +33,14 @@
@Since("5.3.0") @Since("5.3.0")
public class GroupOf<E extends Manageable> extends RapidoidThing { public class GroupOf<E extends Manageable> extends RapidoidThing {


private static String kindOf(Class<? extends Manageable> cls) {
ManageableBean mb = cls.getAnnotation(ManageableBean.class);
U.must(mb != null, "The type '%s' must be annotated with @%s", ManageableBean.class.getSimpleName());
return mb.kind();
}

private final String kind;

private final Class<E> itemType; private final Class<E> itemType;


private final String name; private final String name;
Expand All @@ -42,11 +50,16 @@ public class GroupOf<E extends Manageable> extends RapidoidThing {
private final GroupStats stats = new GroupStats(); private final GroupStats stats = new GroupStats();


public GroupOf(Class<E> itemType, String name) { public GroupOf(Class<E> itemType, String name) {
this.kind = kindOf(itemType);
this.itemType = itemType; this.itemType = itemType;
this.name = name; this.name = name;
Groups.ALL.add(this); Groups.ALL.add(this);
} }


public String kind() {
return kind;
}

public String name() { public String name() {
return name; return name;
} }
Expand Down
4 changes: 2 additions & 2 deletions rapidoid-commons/src/main/java/org/rapidoid/group/Groups.java
Expand Up @@ -64,11 +64,11 @@ public static <T extends Manageable> List<GroupOf<T>> find(Class<? extends T> it
} }


@SuppressWarnings("unchecked") @SuppressWarnings("unchecked")
public static <T extends Manageable> List<GroupOf<T>> find(String itemType) { public static <T extends Manageable> List<GroupOf<T>> find(String kind) {
List<GroupOf<T>> groups = U.list(); List<GroupOf<T>> groups = U.list();


for (GroupOf<?> group : all()) { for (GroupOf<?> group : all()) {
if (group.itemType().getSimpleName().equals(itemType)) { if (group.kind().equals(kind)) {
groups.add((GroupOf<T>) group); groups.add((GroupOf<T>) group);
} }
} }
Expand Down
Expand Up @@ -39,5 +39,4 @@ public interface Manageable {


Object runManageableAction(String action); Object runManageableAction(String action);


String getManageableType();
} }
@@ -0,0 +1,42 @@
package org.rapidoid.group;

import org.rapidoid.annotation.Authors;
import org.rapidoid.annotation.Since;

import java.lang.annotation.Documented;
import java.lang.annotation.Retention;
import java.lang.annotation.Target;

import static java.lang.annotation.ElementType.TYPE;
import static java.lang.annotation.RetentionPolicy.RUNTIME;

/*
* #%L
* rapidoid-commons
* %%
* Copyright (C) 2014 - 2017 Nikolche Mihajlovski and contributors
* %%
* 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.
* #L%
*/

@Target({TYPE})
@Retention(RUNTIME)
@Authors("Nikolche Mihajlovski")
@Since("5.3.3")
@Documented
public @interface ManageableBean {

String kind();

}
Expand Up @@ -23,13 +23,15 @@
import org.rapidoid.annotation.Authors; import org.rapidoid.annotation.Authors;
import org.rapidoid.annotation.Since; import org.rapidoid.annotation.Since;
import org.rapidoid.group.AutoManageable; import org.rapidoid.group.AutoManageable;
import org.rapidoid.group.ManageableBean;
import org.rapidoid.u.U; import org.rapidoid.u.U;


import java.util.List; import java.util.List;
import java.util.concurrent.ThreadPoolExecutor; import java.util.concurrent.ThreadPoolExecutor;


@Authors("Nikolche Mihajlovski") @Authors("Nikolche Mihajlovski")
@Since("5.3.0") @Since("5.3.0")
@ManageableBean(kind = "jobs")
public class ManageableExecutor extends AutoManageable<ManageableExecutor> { public class ManageableExecutor extends AutoManageable<ManageableExecutor> {


private final ThreadPoolExecutor executor; private final ThreadPoolExecutor executor;
Expand All @@ -39,11 +41,6 @@ public ManageableExecutor(String id, ThreadPoolExecutor executor) {
this.executor = executor; this.executor = executor;
} }


@Override
public String getManageableType() {
return "Jobs";
}

@Override @Override
public List<String> getManageableProperties() { public List<String> getManageableProperties() {
return U.list("id", "activeCount", "taskCount", "completedTaskCount", return U.list("id", "activeCount", "taskCount", "completedTaskCount",
Expand Down
Expand Up @@ -5,6 +5,7 @@
import org.rapidoid.collection.Coll; import org.rapidoid.collection.Coll;
import org.rapidoid.commons.Arr; import org.rapidoid.commons.Arr;
import org.rapidoid.group.AbstractManageable; import org.rapidoid.group.AbstractManageable;
import org.rapidoid.group.ManageableBean;
import org.rapidoid.lambda.Lmbd; import org.rapidoid.lambda.Lmbd;
import org.rapidoid.lambda.Operation; import org.rapidoid.lambda.Operation;
import org.rapidoid.log.Log; import org.rapidoid.log.Log;
Expand Down Expand Up @@ -47,6 +48,7 @@


@Authors("Nikolche Mihajlovski") @Authors("Nikolche Mihajlovski")
@Since("5.3.0") @Since("5.3.0")
@ManageableBean(kind = "processes")
public class ProcessHandle extends AbstractManageable { public class ProcessHandle extends AbstractManageable {


private final static Set<ProcessHandle> ALL = Coll.synchronizedSet(); private final static Set<ProcessHandle> ALL = Coll.synchronizedSet();
Expand Down Expand Up @@ -397,11 +399,6 @@ public synchronized String id() {
return id; return id;
} }


@Override
public String getManageableType() {
return "Processes";
}

@Override @Override
public synchronized List<String> getManageableActions() { public synchronized List<String> getManageableActions() {
List<String> actions = U.list("?Restart"); List<String> actions = U.list("?Restart");
Expand Down
10 changes: 6 additions & 4 deletions rapidoid-commons/src/main/java/org/rapidoid/util/Msc.java
Expand Up @@ -1350,13 +1350,15 @@ public static String specialUriPrefix() {
return Msc.isPlatform() ? "/rapidoid/" : "/_"; return Msc.isPlatform() ? "/rapidoid/" : "/_";
} }


public static String specialUri(String suffix) { public static String specialUri(String... suffixes) {
U.must(!suffix.startsWith("/"), "The URI suffix must not start with '/'"); String uri = uri(suffixes);
String suffix = Str.triml(uri, '/');
return specialUriPrefix() + suffix; return specialUriPrefix() + suffix;
} }


public static String semiSpecialUri(String suffix) { public static String semiSpecialUri(String... suffixes) {
U.must(!suffix.startsWith("/"), "The URI suffix must not start with '/'"); String uri = uri(suffixes);
String suffix = Str.triml(uri, '/');
return Msc.isPlatform() ? "/rapidoid/" + suffix : "/" + suffix; return Msc.isPlatform() ? "/rapidoid/" + suffix : "/" + suffix;
} }


Expand Down
1 change: 1 addition & 0 deletions rapidoid-commons/src/main/resources/rapidoid-classes.txt
Expand Up @@ -261,6 +261,7 @@ org.rapidoid.group.GroupOf
org.rapidoid.group.Groups org.rapidoid.group.Groups
org.rapidoid.group.GroupStats org.rapidoid.group.GroupStats
org.rapidoid.group.Manageable org.rapidoid.group.Manageable
org.rapidoid.group.ManageableBean
org.rapidoid.gui.base.AbstractCommand org.rapidoid.gui.base.AbstractCommand
org.rapidoid.gui.base.AbstractInput org.rapidoid.gui.base.AbstractInput
org.rapidoid.gui.base.AbstractOption org.rapidoid.gui.base.AbstractOption
Expand Down
10 changes: 10 additions & 0 deletions rapidoid-gui/src/main/java/org/rapidoid/gui/GUI.java
Expand Up @@ -957,6 +957,16 @@ public static Tag breadcrumb(Object... segments) {
return breadcrumb; return breadcrumb;
} }


public static Tag breadcrumb(Map<?, String> segments) {
Tag breadcrumb = ol().class_("breadcrumb");

for (Map.Entry<?, String> e : segments.entrySet()) {
breadcrumb = breadcrumb.append(li(a(e.getKey()).href(e.getValue())));
}

return breadcrumb;
}

public static Tag autoRefresh(long intervalMs) { public static Tag autoRefresh(long intervalMs) {
return script(U.frmt("Rapidoid.setAutoRefreshInterval(%s);", intervalMs)); return script(U.frmt("Rapidoid.setAutoRefreshInterval(%s);", intervalMs));
} }
Expand Down
6 changes: 2 additions & 4 deletions rapidoid-sql/src/main/java/org/rapidoid/jdbc/JdbcClient.java
Expand Up @@ -8,6 +8,7 @@
import org.rapidoid.datamodel.Results; import org.rapidoid.datamodel.Results;
import org.rapidoid.datamodel.impl.ResultsImpl; import org.rapidoid.datamodel.impl.ResultsImpl;
import org.rapidoid.group.AutoManageable; import org.rapidoid.group.AutoManageable;
import org.rapidoid.group.ManageableBean;
import org.rapidoid.io.Res; import org.rapidoid.io.Res;
import org.rapidoid.log.Log; import org.rapidoid.log.Log;
import org.rapidoid.u.U; import org.rapidoid.u.U;
Expand Down Expand Up @@ -39,6 +40,7 @@


@Authors("Nikolche Mihajlovski") @Authors("Nikolche Mihajlovski")
@Since("3.0.0") @Since("3.0.0")
@ManageableBean(kind = "jdbc")
public class JdbcClient extends AutoManageable<JdbcClient> { public class JdbcClient extends AutoManageable<JdbcClient> {


private volatile boolean initialized; private volatile boolean initialized;
Expand Down Expand Up @@ -453,8 +455,4 @@ public String toString() {
'}'; '}';
} }


@Override
public String getManageableType() {
return "JDBC";
}
} }
Expand Up @@ -10,8 +10,10 @@
import org.rapidoid.http.ReqRespHandler; import org.rapidoid.http.ReqRespHandler;
import org.rapidoid.http.Resp; import org.rapidoid.http.Resp;
import org.rapidoid.u.U; import org.rapidoid.u.U;
import org.rapidoid.util.Msc;


import java.util.List; import java.util.List;
import java.util.Map;


/* /*
* #%L * #%L
Expand Down Expand Up @@ -61,12 +63,15 @@ public Object info(Manageable target, List<String> columns) {


GroupOf<? extends Manageable> group = target.group(); GroupOf<? extends Manageable> group = target.group();


String type = target.getManageableType(); String kind = group.kind();
info.add(breadcrumb(type, group.name(), target.id())); String back = Msc.specialUri("manageables");

Map<String, String> breadcrumb = U.map(kind, back, group.name(), back, target.id(), "#");
info.add(breadcrumb(breadcrumb));


info.add(show(target, U.arrayOf(String.class, columns))); info.add(show(target, U.arrayOf(String.class, columns)));


info.add(autoRefresh(1000)); info.add(autoRefresh(2000));
return info; return info;
} }


Expand Down
Expand Up @@ -54,24 +54,24 @@ public Object call() throws Exception {
} }
} }


info.add(autoRefresh(1000)); info.add(autoRefresh(2000));
return multi(info); return multi(info);
} }


private void addInfo(List<Object> info, final GroupOf<?> group, List<? extends Manageable> items, List<String> columns) { private void addInfo(List<Object> info, final GroupOf<?> group, List<? extends Manageable> items, List<String> columns) {
columns.add("(Actions)"); columns.add("(Actions)");
final String groupName = group.name(); final String groupName = group.name();


String type = U.first(items).getManageableType(); final String kind = group.kind();
info.add(breadcrumb(type, groupName)); info.add(breadcrumb(kind, groupName));


Grid grid = grid(items) Grid grid = grid(items)
.columns(columns) .columns(columns)
.headers(columns) .headers(columns)
.toUri(new Mapper<Manageable, String>() { .toUri(new Mapper<Manageable, String>() {
@Override @Override
public String map(Manageable handle) throws Exception { public String map(Manageable handle) throws Exception {
return Msc.uri("_manageables", handle.getClass().getSimpleName(), Msc.urlEncode(handle.id())); return Msc.specialUri("manageables", kind, Msc.urlEncode(handle.id()));
} }
}) })
.pageSize(20); .pageSize(20);
Expand Down
Expand Up @@ -93,7 +93,7 @@ public String map(ProcessHandle handle) throws Exception {


info.add(grid); info.add(grid);


info.add(autoRefresh(1000)); info.add(autoRefresh(2000));
return multi(info); return multi(info);
} }


Expand Down

0 comments on commit 94a05b0

Please sign in to comment.