http://git-wip-us.apache.org/repos/asf/cloudstack/blob/83fd8f60/utils/src/com/cloud/utils/exception/ExceptionUtil.java ---------------------------------------------------------------------- diff --git a/utils/src/com/cloud/utils/exception/ExceptionUtil.java b/utils/src/com/cloud/utils/exception/ExceptionUtil.java deleted file mode 100644 index 351d2ab..0000000 --- a/utils/src/com/cloud/utils/exception/ExceptionUtil.java +++ /dev/null @@ -1,54 +0,0 @@ -// -// 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 com.cloud.utils.exception; - -import java.io.PrintWriter; -import java.io.StringWriter; - -public class ExceptionUtil { - public static String toString(Throwable th) { - return toString(th, true); - } - - public static String toString(Throwable th, boolean printStack) { - final StringWriter writer = new StringWriter(); - writer.append("Exception: " + th.getClass().getName() + "\n"); - writer.append("Message: "); - writer.append(th.getMessage()).append("\n"); - - if (printStack) { - writer.append("Stack: "); - th.printStackTrace(new PrintWriter(writer)); - } - return writer.toString(); - } - - @SuppressWarnings("unchecked") - public static <T extends Throwable> void rethrow(Throwable t, Class<T> clz) throws T { - if (clz.isAssignableFrom(t.getClass())) - throw (T)t; - } - - public static <T extends Throwable> void rethrowRuntime(Throwable t) { - rethrow(t, RuntimeException.class); - rethrow(t, Error.class); - } - -}
http://git-wip-us.apache.org/repos/asf/cloudstack/blob/83fd8f60/utils/src/com/cloud/utils/exception/ExecutionException.java ---------------------------------------------------------------------- diff --git a/utils/src/com/cloud/utils/exception/ExecutionException.java b/utils/src/com/cloud/utils/exception/ExecutionException.java deleted file mode 100644 index 7b3bc61..0000000 --- a/utils/src/com/cloud/utils/exception/ExecutionException.java +++ /dev/null @@ -1,49 +0,0 @@ -// -// 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 com.cloud.utils.exception; - -import com.cloud.utils.SerialVersionUID; - -/** - * a public method. - * - */ -public class ExecutionException extends Exception { - private static final long serialVersionUID = SerialVersionUID.ExecutionException; - - protected int csErrorCode; - - public ExecutionException(String msg, Throwable cause) { - super(msg, cause); - setCSErrorCode(CSExceptionErrorCode.getCSErrCode(this.getClass().getName())); - } - - public ExecutionException(String msg) { - super(msg); - } - - public void setCSErrorCode(int cserrcode) { - this.csErrorCode = cserrcode; - } - - public int getCSErrorCode() { - return this.csErrorCode; - } -} http://git-wip-us.apache.org/repos/asf/cloudstack/blob/83fd8f60/utils/src/com/cloud/utils/exception/HypervisorVersionChangedException.java ---------------------------------------------------------------------- diff --git a/utils/src/com/cloud/utils/exception/HypervisorVersionChangedException.java b/utils/src/com/cloud/utils/exception/HypervisorVersionChangedException.java deleted file mode 100644 index 55c273b..0000000 --- a/utils/src/com/cloud/utils/exception/HypervisorVersionChangedException.java +++ /dev/null @@ -1,35 +0,0 @@ -// -// 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 com.cloud.utils.exception; - -import com.cloud.utils.SerialVersionUID; - -public class HypervisorVersionChangedException extends CloudRuntimeException { - - private static final long serialVersionUID = SerialVersionUID.CloudRuntimeException; - - public HypervisorVersionChangedException(String message) { - super(message); - } - - protected HypervisorVersionChangedException() { - super(); - } -} http://git-wip-us.apache.org/repos/asf/cloudstack/blob/83fd8f60/utils/src/com/cloud/utils/fsm/ChangeEvent.java ---------------------------------------------------------------------- diff --git a/utils/src/com/cloud/utils/fsm/ChangeEvent.java b/utils/src/com/cloud/utils/fsm/ChangeEvent.java deleted file mode 100644 index 15f4f6e..0000000 --- a/utils/src/com/cloud/utils/fsm/ChangeEvent.java +++ /dev/null @@ -1,24 +0,0 @@ -// -// 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 com.cloud.utils.fsm; - -public class ChangeEvent { - -} http://git-wip-us.apache.org/repos/asf/cloudstack/blob/83fd8f60/utils/src/com/cloud/utils/fsm/FiniteState.java ---------------------------------------------------------------------- diff --git a/utils/src/com/cloud/utils/fsm/FiniteState.java b/utils/src/com/cloud/utils/fsm/FiniteState.java deleted file mode 100644 index e6f2cd0..0000000 --- a/utils/src/com/cloud/utils/fsm/FiniteState.java +++ /dev/null @@ -1,58 +0,0 @@ -// -// 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 com.cloud.utils.fsm; - -import java.util.List; -import java.util.Set; - -/** - * - * @param <S> State - * @param <E> Event - */ -public interface FiniteState<S, E> { - /** - * @return the state machine being used. - */ - StateMachine<S, E> getStateMachine(); - - /** - * get next state based on the event. - * @param event - * @return next State - */ - S getNextState(E event); - - /** - * Get the states that could have traveled to the current state - * via this event. - * @param event - * @return array of states - */ - List<S> getFromStates(E event); - - /** - * Get the possible events that can happen from the current state. - * @return array of events. - */ - Set<E> getPossibleEvents(); - - String getDescription(); -} http://git-wip-us.apache.org/repos/asf/cloudstack/blob/83fd8f60/utils/src/com/cloud/utils/fsm/FiniteState2.java ---------------------------------------------------------------------- diff --git a/utils/src/com/cloud/utils/fsm/FiniteState2.java b/utils/src/com/cloud/utils/fsm/FiniteState2.java deleted file mode 100644 index 14b9a5e..0000000 --- a/utils/src/com/cloud/utils/fsm/FiniteState2.java +++ /dev/null @@ -1,34 +0,0 @@ -// -// 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 com.cloud.utils.fsm; - -import java.util.Set; - -public interface FiniteState2<T, E> { - - StateMachine2<T, ? extends ChangeEvent, ? extends StateObject<?>> getStateMachine(); - - T getNextState(ChangeEvent e) throws NoTransitionException; - - T getFromStates(ChangeEvent e); - - Set<ChangeEvent> getPossibleEvents(); - -} http://git-wip-us.apache.org/repos/asf/cloudstack/blob/83fd8f60/utils/src/com/cloud/utils/fsm/FiniteStateObject.java ---------------------------------------------------------------------- diff --git a/utils/src/com/cloud/utils/fsm/FiniteStateObject.java b/utils/src/com/cloud/utils/fsm/FiniteStateObject.java deleted file mode 100644 index a57e3b4..0000000 --- a/utils/src/com/cloud/utils/fsm/FiniteStateObject.java +++ /dev/null @@ -1,25 +0,0 @@ -// -// 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 com.cloud.utils.fsm; - -public interface FiniteStateObject<S, E> { - - void setState(S state); -} http://git-wip-us.apache.org/repos/asf/cloudstack/blob/83fd8f60/utils/src/com/cloud/utils/fsm/NoTransitionException.java ---------------------------------------------------------------------- diff --git a/utils/src/com/cloud/utils/fsm/NoTransitionException.java b/utils/src/com/cloud/utils/fsm/NoTransitionException.java deleted file mode 100644 index 241e456..0000000 --- a/utils/src/com/cloud/utils/fsm/NoTransitionException.java +++ /dev/null @@ -1,36 +0,0 @@ -// -// 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 com.cloud.utils.fsm; - -import com.cloud.utils.SerialVersionUID; - -/** - * Thrown by the state machine when there is no transition from one state - * to another. - * - */ -public class NoTransitionException extends Exception { - - private static final long serialVersionUID = SerialVersionUID.NoTransitionException; - - public NoTransitionException(String msg) { - super(msg); - } -} http://git-wip-us.apache.org/repos/asf/cloudstack/blob/83fd8f60/utils/src/com/cloud/utils/fsm/State.java ---------------------------------------------------------------------- diff --git a/utils/src/com/cloud/utils/fsm/State.java b/utils/src/com/cloud/utils/fsm/State.java deleted file mode 100644 index 0af0e61..0000000 --- a/utils/src/com/cloud/utils/fsm/State.java +++ /dev/null @@ -1,27 +0,0 @@ -// -// 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 com.cloud.utils.fsm; - -/** - * State represents one state for that object - */ -public interface State<T> { - -} http://git-wip-us.apache.org/repos/asf/cloudstack/blob/83fd8f60/utils/src/com/cloud/utils/fsm/StateDao.java ---------------------------------------------------------------------- diff --git a/utils/src/com/cloud/utils/fsm/StateDao.java b/utils/src/com/cloud/utils/fsm/StateDao.java deleted file mode 100644 index 43ce25c..0000000 --- a/utils/src/com/cloud/utils/fsm/StateDao.java +++ /dev/null @@ -1,25 +0,0 @@ -// -// 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 com.cloud.utils.fsm; - -public interface StateDao<S, E, V> { - boolean updateState(S currentState, E event, S nextState, V vo, Object data); - -} http://git-wip-us.apache.org/repos/asf/cloudstack/blob/83fd8f60/utils/src/com/cloud/utils/fsm/StateListener.java ---------------------------------------------------------------------- diff --git a/utils/src/com/cloud/utils/fsm/StateListener.java b/utils/src/com/cloud/utils/fsm/StateListener.java deleted file mode 100644 index 96e8be9..0000000 --- a/utils/src/com/cloud/utils/fsm/StateListener.java +++ /dev/null @@ -1,43 +0,0 @@ -// -// 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 com.cloud.utils.fsm; - -public interface StateListener<S, E, V> { - /** - * Event is triggered before state machine transition finished. - * If you want to get the state of vm before state machine changed, you need to listen on this event - * @param oldState VM's old state - * @param event that triggered this VM state change - * @param newState VM's new state - * @param vo the VM instance - * @param opaque host id - * @return - */ - public boolean preStateTransitionEvent(S oldState, E event, S newState, V vo, boolean status, Object opaque); - - /** - * Event is triggered after state machine transition finished - * @param transition The Transition fo the Event - * @param vo the VM instance - * @param status the state transition is allowed or not - * @return - */ - public boolean postStateTransitionEvent(StateMachine2.Transition<S, E> transition, V vo, boolean status, Object opaque); -} http://git-wip-us.apache.org/repos/asf/cloudstack/blob/83fd8f60/utils/src/com/cloud/utils/fsm/StateMachine.java ---------------------------------------------------------------------- diff --git a/utils/src/com/cloud/utils/fsm/StateMachine.java b/utils/src/com/cloud/utils/fsm/StateMachine.java deleted file mode 100644 index d6d5b4d..0000000 --- a/utils/src/com/cloud/utils/fsm/StateMachine.java +++ /dev/null @@ -1,147 +0,0 @@ -// -// 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 com.cloud.utils.fsm; - -import java.util.ArrayList; -import java.util.Formatter; -import java.util.HashMap; -import java.util.List; -import java.util.Map; -import java.util.Set; - -/** - * Specifically, it implements the Moore machine. - * so someone else can add/modify states easily without regression. - * business logic anyways. - * - * @param <S> state - * @param <E> event - */ -public class StateMachine<S, E> { - private final HashMap<S, StateEntry> _states = new HashMap<S, StateEntry>(); - private final StateEntry _initialStateEntry; - - public StateMachine() { - _initialStateEntry = new StateEntry(null); - } - - public void addTransition(S currentState, E event, S toState) { - StateEntry entry = null; - if (currentState == null) { - entry = _initialStateEntry; - } else { - entry = _states.get(currentState); - if (entry == null) { - entry = new StateEntry(currentState); - _states.put(currentState, entry); - } - } - - entry.addTransition(event, toState); - - entry = _states.get(toState); - if (entry == null) { - entry = new StateEntry(toState); - _states.put(toState, entry); - } - entry.addFromTransition(event, currentState); - } - - public Set<E> getPossibleEvents(S s) { - StateEntry entry = _states.get(s); - return entry.nextStates.keySet(); - } - - public S getNextState(S s, E e) { - StateEntry entry = null; - if (s == null) { - entry = _initialStateEntry; - } else { - entry = _states.get(s); - assert entry != null : "Cannot retrieve transitions for state " + s.toString(); - } - - return entry.nextStates.get(e); - } - - public List<S> getFromStates(S s, E e) { - StateEntry entry = _states.get(s); - if (entry == null) { - return new ArrayList<S>(); - } - - return entry.prevStates.get(e); - } - - @Override - public String toString() { - StringBuilder str = new StringBuilder(1024); - _initialStateEntry.buildString(str); - for (StateEntry entry : _states.values()) { - entry.buildString(str); - } - return str.toString(); - } - - private class StateEntry { - public S state; - public HashMap<E, S> nextStates; - public HashMap<E, List<S>> prevStates; - - public StateEntry(S state) { - this.state = state; - nextStates = new HashMap<E, S>(); - prevStates = new HashMap<E, List<S>>(); - } - - public void addTransition(E e, S s) { - assert !nextStates.containsKey(e) : "State " + getStateStr() + " already contains a transition to state " + nextStates.get(e).toString() + " via event " + - e.toString() + ". Please revisit the rule you're adding to state " + s.toString(); - nextStates.put(e, s); - } - - public void addFromTransition(E e, S s) { - List<S> l = prevStates.get(e); - if (l == null) { - l = new ArrayList<S>(); - prevStates.put(e, l); - } - - assert !l.contains(s) : "Already contains the from transition " + e.toString() + " from state " + s.toString() + " to " + getStateStr(); - l.add(s); - } - - protected String getStateStr() { - return state == null ? "Initial" : state.toString(); - } - - public void buildString(StringBuilder str) { - str.append("State: ").append(getStateStr()).append("\n"); - for (Map.Entry<E, S> nextState : nextStates.entrySet()) { - str.append(" --> Event: "); - Formatter format = new Formatter(); - str.append(format.format("%-30s", nextState.getKey().toString())); - str.append("----> State: "); - str.append(nextState.getValue().toString()); - str.append("\n"); - } - } - } -} http://git-wip-us.apache.org/repos/asf/cloudstack/blob/83fd8f60/utils/src/com/cloud/utils/fsm/StateMachine2.java ---------------------------------------------------------------------- diff --git a/utils/src/com/cloud/utils/fsm/StateMachine2.java b/utils/src/com/cloud/utils/fsm/StateMachine2.java deleted file mode 100644 index 431d961..0000000 --- a/utils/src/com/cloud/utils/fsm/StateMachine2.java +++ /dev/null @@ -1,261 +0,0 @@ -// -// 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 com.cloud.utils.fsm; - -import java.util.ArrayList; -import java.util.Formatter; -import java.util.HashMap; -import java.util.List; -import java.util.Map; -import java.util.Set; - -/** - * Specifically, it implements the Moore machine. - * so someone else can add/modify states easily without regression. - * business logic anyways. - * - * @param <S> state - * @param <E> event - */ -public class StateMachine2<S, E, V extends StateObject<S>> { - private final HashMap<S, StateEntry> _states = new HashMap<S, StateEntry>(); - private final StateEntry _initialStateEntry; - - private List<StateListener<S, E, V>> _listeners = new ArrayList<StateListener<S, E, V>>(); - - public StateMachine2() { - _initialStateEntry = new StateEntry(null); - - } - - public void addTransition(S currentState, E event, S toState) { - addTransition(new Transition<S, E>(currentState, event, toState, null)); - } - - - public void addTransition(Transition<S, E> transition) { - S currentState = transition.getCurrentState(); - E event = transition.getEvent(); - S toState = transition.getToState(); - StateEntry entry = null; - if (currentState == null) { - entry = _initialStateEntry; - } else { - entry = _states.get(currentState); - if (entry == null) { - entry = new StateEntry(currentState); - _states.put(currentState, entry); - } - } - - entry.addTransition(event, toState, transition); - - entry = _states.get(toState); - if (entry == null) { - entry = new StateEntry(toState); - _states.put(toState, entry); - } - entry.addFromTransition(event, currentState); - } - - public Set<E> getPossibleEvents(S s) { - StateEntry entry = _states.get(s); - return entry.nextStates.keySet(); - } - - public S getNextState(S s, E e) throws NoTransitionException { - return getTransition(s, e).getToState(); - } - - public Transition<S, E> getTransition(S s, E e) throws NoTransitionException { - StateEntry entry = null; - if (s == null) { - entry = _initialStateEntry; - } else { - entry = _states.get(s); - assert entry != null : "Cannot retrieve transitions for state " + s; - } - - Transition<S, E> transition = entry.nextStates.get(e); - if (transition == null) { - throw new NoTransitionException("Unable to transition to a new state from " + s + " via " + e); - } - return transition; - } - - public List<S> getFromStates(S s, E e) { - StateEntry entry = _states.get(s); - if (entry == null) { - return new ArrayList<S>(); - } - - return entry.prevStates.get(e); - } - - public boolean transitTo(V vo, E e, Object opaque, StateDao<S, E, V> dao) throws NoTransitionException { - S currentState = vo.getState(); - S nextState = getNextState(currentState, e); - Transition<S, E> transition = getTransition(currentState, e); - - boolean transitionStatus = true; - if (nextState == null) { - transitionStatus = false; - } - - for (StateListener<S, E, V> listener : _listeners) { - listener.preStateTransitionEvent(currentState, e, nextState, vo, transitionStatus, opaque); - } - - transitionStatus = dao.updateState(currentState, e, nextState, vo, opaque); - if (!transitionStatus) { - return false; - } - - for (StateListener<S, E, V> listener : _listeners) { - listener.postStateTransitionEvent(transition, vo, transitionStatus, opaque); - } - - return true; - } - - public boolean registerListener(StateListener<S, E, V> listener) { - synchronized (_listeners) { - return _listeners.add(listener); - } - } - - @Override - public String toString() { - StringBuilder str = new StringBuilder(1024); - _initialStateEntry.buildString(str); - for (StateEntry entry : _states.values()) { - entry.buildString(str); - } - return str.toString(); - } - - public static class Transition<S, E> { - - private S currentState; - - private E event; - - private S toState; - - private List<Impact> impacts; - - public static enum Impact { - USAGE - } - - public Transition(S currentState, E event, S toState, List<Impact> impacts) { - this.currentState = currentState; - this.event = event; - this.toState = toState; - this.impacts = impacts; - } - - public S getCurrentState() { - return currentState; - } - - public E getEvent() { - return event; - } - - public S getToState() { - return toState; - } - - public boolean isImpacted(Impact impact) { - if (impacts == null || impacts.isEmpty()) { - return false; - } - return impacts.contains(impact); - } - - @Override - public boolean equals(Object o) { - if (this == o) return true; - if (o == null || getClass() != o.getClass()) return false; - - Transition that = (Transition) o; - - if (currentState != null ? !currentState.equals(that.currentState) : that.currentState != null) return false; - if (event != null ? !event.equals(that.event) : that.event != null) return false; - if (toState != null ? !toState.equals(that.toState) : that.toState != null) return false; - - return true; - } - - @Override - public int hashCode() { - int result = currentState != null ? currentState.hashCode() : 0; - result = 31 * result + (event != null ? event.hashCode() : 0); - result = 31 * result + (toState != null ? toState.hashCode() : 0); - return result; - } - } - - private class StateEntry { - public S state; - public HashMap<E, Transition<S, E>> nextStates; - public HashMap<E, List<S>> prevStates; - - public StateEntry(S state) { - this.state = state; - prevStates = new HashMap<E, List<S>>(); - nextStates = new HashMap<E, Transition<S, E>>(); - } - - public void addTransition(E e, S s, Transition<S, E> transition) { - assert !nextStates.containsKey(e) : "State " + getStateStr() + " already contains a transition to state " + nextStates.get(e).toString() + " via event " + - e.toString() + ". Please revisit the rule you're adding to state " + s.toString(); - nextStates.put(e, transition); - } - - public void addFromTransition(E e, S s) { - List<S> l = prevStates.get(e); - if (l == null) { - l = new ArrayList<S>(); - prevStates.put(e, l); - } - - assert !l.contains(s) : "Already contains the from transition " + e.toString() + " from state " + s.toString() + " to " + getStateStr(); - l.add(s); - } - - protected String getStateStr() { - return state == null ? "Initial" : state.toString(); - } - - public void buildString(StringBuilder str) { - str.append("State: ").append(getStateStr()).append("\n"); - for (Map.Entry<E, Transition<S, E>> nextState : nextStates.entrySet()) { - str.append(" --> Event: "); - Formatter format = new Formatter(); - str.append(format.format("%-30s", nextState.getKey().toString())); - str.append("----> State: "); - str.append(nextState.getValue().toString()); - str.append("\n"); - } - } - } -} http://git-wip-us.apache.org/repos/asf/cloudstack/blob/83fd8f60/utils/src/com/cloud/utils/fsm/StateObject.java ---------------------------------------------------------------------- diff --git a/utils/src/com/cloud/utils/fsm/StateObject.java b/utils/src/com/cloud/utils/fsm/StateObject.java deleted file mode 100644 index 85dd441..0000000 --- a/utils/src/com/cloud/utils/fsm/StateObject.java +++ /dev/null @@ -1,27 +0,0 @@ -// -// 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 com.cloud.utils.fsm; - -public interface StateObject<S> { - /** - * @return finite state. - */ - S getState(); -} http://git-wip-us.apache.org/repos/asf/cloudstack/blob/83fd8f60/utils/src/com/cloud/utils/log/CglibThrowableRenderer.java ---------------------------------------------------------------------- diff --git a/utils/src/com/cloud/utils/log/CglibThrowableRenderer.java b/utils/src/com/cloud/utils/log/CglibThrowableRenderer.java deleted file mode 100644 index b102dc4..0000000 --- a/utils/src/com/cloud/utils/log/CglibThrowableRenderer.java +++ /dev/null @@ -1,84 +0,0 @@ -// -// 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 com.cloud.utils.log; - -import java.io.PrintWriter; -import java.util.ArrayList; - -import org.apache.log4j.spi.ThrowableRenderer; - -/** - * This renderer removes all the Cglib generated methods from the call - * - * Unfortunately, I had to copy out the EnhancedThrowableRenderer from - * the apach libraries because EnhancedThrowableRenderer is a final class. - * simply override doRender. Not sure what the developers are thinking there - * making it final. - * - * <throwableRenderer class="com.cloud.utils.log.CglibThrowableRenderer"/> - * into log4j.xml. - * - */ -public class CglibThrowableRenderer implements ThrowableRenderer { - /** - * Construct new instance. - */ - public CglibThrowableRenderer() { - super(); - } - - @Override - public String[] doRender(final Throwable th) { - try { - ArrayList<String> lines = new ArrayList<String>(); - Throwable throwable = th; - lines.add(throwable.toString()); - int start = 0; - do { - StackTraceElement[] elements = throwable.getStackTrace(); - for (int i = 0; i < elements.length - start; i++) { - StackTraceElement element = elements[i]; - String filename = element.getFileName(); - String method = element.getMethodName(); - if ((filename != null && filename.equals("<generated>")) || (method != null && method.equals("invokeSuper"))) { - continue; - } - lines.add("\tat " + element.toString()); - } - if (start != 0) { - lines.add("\t... " + start + " more"); - } - throwable = throwable.getCause(); - if (throwable != null) { - lines.add("Caused by: " + throwable.toString()); - start = elements.length - 1; - } - } while (throwable != null); - return lines.toArray(new String[lines.size()]); - } catch (Exception ex) { - PrintWriter pw = new PrintWriter(System.err); - ex.printStackTrace(pw); - pw = new PrintWriter(System.out); - ex.printStackTrace(pw); - ex.printStackTrace(); - return null; - } - } -} http://git-wip-us.apache.org/repos/asf/cloudstack/blob/83fd8f60/utils/src/com/cloud/utils/mgmt/JmxUtil.java ---------------------------------------------------------------------- diff --git a/utils/src/com/cloud/utils/mgmt/JmxUtil.java b/utils/src/com/cloud/utils/mgmt/JmxUtil.java deleted file mode 100644 index 49076f7..0000000 --- a/utils/src/com/cloud/utils/mgmt/JmxUtil.java +++ /dev/null @@ -1,90 +0,0 @@ -// -// 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 com.cloud.utils.mgmt; - -import java.lang.management.ManagementFactory; -import java.util.ArrayList; - -import javax.management.InstanceAlreadyExistsException; -import javax.management.InstanceNotFoundException; -import javax.management.MBeanRegistrationException; -import javax.management.MBeanServer; -import javax.management.MBeanServerFactory; -import javax.management.MalformedObjectNameException; -import javax.management.NotCompliantMBeanException; -import javax.management.ObjectName; - -public class JmxUtil { - public static ObjectName registerMBean(ManagementBean mbean) throws MalformedObjectNameException, InstanceAlreadyExistsException, MBeanRegistrationException, - NotCompliantMBeanException { - - return registerMBean(mbean.getName(), null, mbean); - } - - public static ObjectName registerMBean(String objTypeName, String objInstanceName, Object mbean) throws MalformedObjectNameException, InstanceAlreadyExistsException, - MBeanRegistrationException, NotCompliantMBeanException { - - String name = "com.cloud:type=" + objTypeName; - if (objInstanceName != null && !objInstanceName.isEmpty()) - name += ", name=" + objInstanceName; - ObjectName objectName = new ObjectName(name); - - ArrayList<MBeanServer> server = MBeanServerFactory.findMBeanServer(null); - if (server.size() > 0) { - MBeanServer mBeanServer = server.get(0); - if (!mBeanServer.isRegistered(objectName)) - mBeanServer.registerMBean(mbean, objectName); - return objectName; - } else { - MBeanServer mBeanServer = ManagementFactory.getPlatformMBeanServer(); - if (!mBeanServer.isRegistered(objectName)) - mBeanServer.registerMBean(mbean, objectName); - return objectName; - } - } - - public static void unregisterMBean(String objTypeName, String objInstanceName) throws MalformedObjectNameException, MBeanRegistrationException, - InstanceNotFoundException { - - ObjectName name = composeMBeanName(objTypeName, objInstanceName); - unregisterMBean(name); - } - - public static void unregisterMBean(ObjectName name) throws MalformedObjectNameException, MBeanRegistrationException, InstanceNotFoundException { - - ArrayList<MBeanServer> server = MBeanServerFactory.findMBeanServer(null); - if (server.size() > 0) { - MBeanServer mBeanServer = server.get(0); - mBeanServer.unregisterMBean(name); - } else { - MBeanServer mBeanServer = ManagementFactory.getPlatformMBeanServer(); - mBeanServer.unregisterMBean(name); - } - } - - private static ObjectName composeMBeanName(String objTypeName, String objInstanceName) throws MalformedObjectNameException { - - String name = "com.cloud:type=" + objTypeName; - if (objInstanceName != null && !objInstanceName.isEmpty()) - name += ", name=" + objInstanceName; - - return new ObjectName(name); - } -} http://git-wip-us.apache.org/repos/asf/cloudstack/blob/83fd8f60/utils/src/com/cloud/utils/mgmt/ManagementBean.java ---------------------------------------------------------------------- diff --git a/utils/src/com/cloud/utils/mgmt/ManagementBean.java b/utils/src/com/cloud/utils/mgmt/ManagementBean.java deleted file mode 100644 index 387052e..0000000 --- a/utils/src/com/cloud/utils/mgmt/ManagementBean.java +++ /dev/null @@ -1,27 +0,0 @@ -// -// 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 com.cloud.utils.mgmt; - -/** - * we ever need common use methods here. - */ -public interface ManagementBean { - String getName(); -} http://git-wip-us.apache.org/repos/asf/cloudstack/blob/83fd8f60/utils/src/com/cloud/utils/mgmt/PropertyMapDynamicBean.java ---------------------------------------------------------------------- diff --git a/utils/src/com/cloud/utils/mgmt/PropertyMapDynamicBean.java b/utils/src/com/cloud/utils/mgmt/PropertyMapDynamicBean.java deleted file mode 100644 index d1689eb..0000000 --- a/utils/src/com/cloud/utils/mgmt/PropertyMapDynamicBean.java +++ /dev/null @@ -1,120 +0,0 @@ -// -// 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 com.cloud.utils.mgmt; - -import java.util.HashMap; -import java.util.Iterator; -import java.util.Map; -import java.util.SortedSet; -import java.util.TreeSet; - -import javax.management.Attribute; -import javax.management.AttributeList; -import javax.management.AttributeNotFoundException; -import javax.management.DynamicMBean; -import javax.management.InvalidAttributeValueException; -import javax.management.MBeanAttributeInfo; -import javax.management.MBeanException; -import javax.management.MBeanInfo; -import javax.management.ReflectionException; - -public class PropertyMapDynamicBean implements DynamicMBean { - - private Map<String, Object> _propMap = new HashMap<String, Object>(); - - public PropertyMapDynamicBean() { - } - - public PropertyMapDynamicBean(Map<String, Object> propMap) { - _propMap = propMap; - } - - @Override - public synchronized Object getAttribute(String name) throws AttributeNotFoundException, MBeanException, ReflectionException { - if (_propMap != null) { - return _propMap.get(name); - } - - throw new AttributeNotFoundException("No such property " + name); - } - - @Override - public synchronized AttributeList getAttributes(String[] names) { - AttributeList list = new AttributeList(); - for (String name : names) { - Object value = _propMap.get(name); - if (value != null) - list.add(new Attribute(name, value)); - } - return list; - } - - @Override - public synchronized MBeanInfo getMBeanInfo() { - SortedSet<String> names = new TreeSet<String>(); - - for (String name : _propMap.keySet()) - names.add(name); - - MBeanAttributeInfo[] attrs = new MBeanAttributeInfo[names.size()]; - Iterator<String> it = names.iterator(); - for (int i = 0; i < attrs.length; i++) { - String name = it.next(); - attrs[i] = new MBeanAttributeInfo(name, "java.lang.String", name, true, // isReadable - true, // isWritable - false); // isIs - } - - return new MBeanInfo(this.getClass().getName(), "Dynamic MBean", attrs, null, null, null); - } - - @Override - public synchronized Object invoke(String name, Object[] args, String[] sig) throws MBeanException, ReflectionException { - throw new ReflectionException(new NoSuchMethodException(name)); - } - - @Override - public synchronized void setAttribute(Attribute attr) throws AttributeNotFoundException, InvalidAttributeValueException, MBeanException, ReflectionException { - String name = attr.getName(); - if (name != null) - _propMap.put(name, attr.getValue()); - } - - @Override - public synchronized AttributeList setAttributes(AttributeList list) { - Attribute[] attrs = list.toArray(new Attribute[0]); - AttributeList retList = new AttributeList(); - for (Attribute attr : attrs) { - String name = attr.getName(); - Object value = attr.getValue(); - _propMap.put(name, value); - retList.add(new Attribute(name, value)); - } - return retList; - } - - public synchronized void addProp(String name, Object value) { - _propMap.put(name, value); - } - - public synchronized Object getProp(String name) { - return _propMap.get(name); - } -} http://git-wip-us.apache.org/repos/asf/cloudstack/blob/83fd8f60/utils/src/com/cloud/utils/net/Ip.java ---------------------------------------------------------------------- diff --git a/utils/src/com/cloud/utils/net/Ip.java b/utils/src/com/cloud/utils/net/Ip.java deleted file mode 100644 index 09312bc..0000000 --- a/utils/src/com/cloud/utils/net/Ip.java +++ /dev/null @@ -1,98 +0,0 @@ -// -// 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 com.cloud.utils.net; - -import java.io.Serializable; - -import com.cloud.utils.NumbersUtil; -import com.cloud.utils.SerialVersionUID; - -/** - * Simple Ip implementation class that works with both ip4 and ip6. - * - */ -public class Ip implements Serializable, Comparable<Ip> { - - private static final long serialVersionUID = SerialVersionUID.Ip; - - long ip; - - public Ip(long ip) { - this.ip = ip; - } - - public Ip(String ip) { - this.ip = NetUtils.ip2Long(ip); - } - - protected Ip() { - } - - public String addr() { - return toString(); - } - - public long longValue() { - return ip; - } - - @Override - public String toString() { - return NetUtils.long2Ip(ip); - } - - public boolean isIp4() { - return ip <= 2L * Integer.MAX_VALUE + 1; - } - - public boolean isIp6() { - return ip > Integer.MAX_VALUE; - } - - @Override - public int hashCode() { - return NumbersUtil.hash(ip); - } - - @Override - public boolean equals(Object obj) { - if (obj instanceof Ip) { - return ip == ((Ip)obj).ip; - } - return false; - } - - public boolean isSameAddressAs(Object obj) { - if (this.equals(obj)) { - return true; - } else if (obj instanceof String) { - return ip == NetUtils.ip2Long((String)obj); - } else if (obj instanceof Long) { - return ip == (Long)obj; - } else { - return false; - } - } - - @Override - public int compareTo(Ip that) { - return (int)(this.ip - that.ip); - } -} http://git-wip-us.apache.org/repos/asf/cloudstack/blob/83fd8f60/utils/src/com/cloud/utils/net/Ip4Address.java ---------------------------------------------------------------------- diff --git a/utils/src/com/cloud/utils/net/Ip4Address.java b/utils/src/com/cloud/utils/net/Ip4Address.java deleted file mode 100644 index 0bd814d..0000000 --- a/utils/src/com/cloud/utils/net/Ip4Address.java +++ /dev/null @@ -1,80 +0,0 @@ -// -// 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 com.cloud.utils.net; - -public class Ip4Address { - String _addr; - String _mac; - static final String s_empty_mac = "00:00:00:00:00:00"; - - public Ip4Address(String addr, String mac) { - _addr = addr; - _mac = mac; - } - - public Ip4Address(long addr, long mac) { - _addr = NetUtils.long2Ip(addr); - _mac = NetUtils.long2Mac(mac); - } - - public Ip4Address(String addr) { - this(addr, s_empty_mac); - } - - public Ip4Address(long addr) { - this(NetUtils.long2Ip(addr), s_empty_mac); - } - - public String ip4() { - return _addr; - } - - public String mac() { - return _mac; - } - - public long toLong() { - return NetUtils.ip2Long(_addr); - } - - @Override - public boolean equals(Object that) { - - if (that instanceof Ip4Address) { - Ip4Address ip4 = (Ip4Address)that; - return _addr.equals(ip4._addr) && (_mac == ip4._mac || _mac.equals(ip4._mac)); - } else { - return false; - } - } - - public boolean isSameAddressAs(Object other) { - if (other instanceof String) { // Assume that is an ip4 address in String form - return _addr.equals(other); - } else { - return equals(other); - } - } - - @Override - public int hashCode(){ - return _mac.hashCode()*_addr.hashCode(); - } -} http://git-wip-us.apache.org/repos/asf/cloudstack/blob/83fd8f60/utils/src/com/cloud/utils/net/MacAddress.java ---------------------------------------------------------------------- diff --git a/utils/src/com/cloud/utils/net/MacAddress.java b/utils/src/com/cloud/utils/net/MacAddress.java deleted file mode 100644 index b9118cf..0000000 --- a/utils/src/com/cloud/utils/net/MacAddress.java +++ /dev/null @@ -1,367 +0,0 @@ -// -// 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 com.cloud.utils.net; - -import static com.cloud.utils.AutoCloseableUtil.closeAutoCloseable; - -import java.io.BufferedReader; -import java.io.File; -import java.io.IOException; -import java.io.InputStreamReader; -import java.net.InetAddress; -import java.net.UnknownHostException; -import java.util.Formatter; - -import org.apache.log4j.Logger; - -import com.cloud.utils.NumbersUtil; - -/** - * copied from the public domain utility from John Burkard. - * @author <a href="mailto:[email protected]">Johann Burkard</a> - * @version 2.1.3 - **/ -public class MacAddress { - private static final Logger s_logger = Logger.getLogger(MacAddress.class); - private long _addr = 0; - - protected MacAddress() { - } - - public MacAddress(long addr) { - _addr = addr; - } - - public long toLong() { - return _addr; - } - - public byte[] toByteArray() { - byte[] bytes = new byte[6]; - bytes[0] = (byte)((_addr >> 40) & 0xff); - bytes[1] = (byte)((_addr >> 32) & 0xff); - bytes[2] = (byte)((_addr >> 24) & 0xff); - bytes[3] = (byte)((_addr >> 16) & 0xff); - bytes[4] = (byte)((_addr >> 8) & 0xff); - bytes[5] = (byte)((_addr >> 0) & 0xff); - return bytes; - } - - public String toString(String separator) { - StringBuilder buff = new StringBuilder(); - Formatter formatter = new Formatter(buff); - formatter.format("%02x%s%02x%s%02x%s%02x%s%02x%s%02x", _addr >> 40 & 0xff, separator, _addr >> 32 & 0xff, separator, _addr >> 24 & 0xff, separator, - _addr >> 16 & 0xff, separator, _addr >> 8 & 0xff, separator, _addr & 0xff); - return buff.toString(); - - /* - - String str = Long.toHexString(_addr); - - for (int i = str.length() - 1; i >= 0; i--) { - buff.append(str.charAt(i)); - if (separator != null && (str.length() - i) % 2 == 0) { - buff.append(separator); - } - } - return buff.reverse().toString(); - */ - } - - @Override - public String toString() { - return toString(":"); - } - - private static MacAddress s_address; - static { - String macAddress = null; - - Process p = null; - BufferedReader in = null; - - try { - String osname = System.getProperty("os.name"); - - if (osname.startsWith("Windows")) { - p = Runtime.getRuntime().exec(new String[] {"ipconfig", "/all"}, null); - } else if (osname.startsWith("Solaris") || osname.startsWith("SunOS")) { - // Solaris code must appear before the generic code - String hostName = MacAddress.getFirstLineOfCommand(new String[] {"uname", "-n"}); - if (hostName != null) { - p = Runtime.getRuntime().exec(new String[] {"/usr/sbin/arp", hostName}, null); - } - } else if (new File("/usr/sbin/lanscan").exists()) { - p = Runtime.getRuntime().exec(new String[] {"/usr/sbin/lanscan"}, null); - } else if (new File("/sbin/ifconfig").exists()) { - p = Runtime.getRuntime().exec(new String[] {"/sbin/ifconfig", "-a"}, null); - } - - if (p != null) { - in = new BufferedReader(new InputStreamReader(p.getInputStream()), 128); - String l = null; - while ((l = in.readLine()) != null) { - macAddress = MacAddress.parse(l); - if (macAddress != null) { - short parsedShortMacAddress = MacAddress.parseShort(macAddress); - if (parsedShortMacAddress != 0xff && parsedShortMacAddress != 0x00) - break; - } - macAddress = null; - } - } - - } catch (SecurityException ex) { - s_logger.info("[ignored] security exception in static initializer of MacAddress", ex); - } catch (IOException ex) { - s_logger.info("[ignored] io exception in static initializer of MacAddress"); - } finally { - if (p != null) { - closeAutoCloseable(in, "closing init process input stream"); - closeAutoCloseable(p.getErrorStream(), "closing init process error output stream"); - closeAutoCloseable(p.getOutputStream(), "closing init process std output stream"); - p.destroy(); - } - } - - long clockSeqAndNode = 0; - - if (macAddress != null) { - if (macAddress.indexOf(':') != -1) { - clockSeqAndNode |= MacAddress.parseLong(macAddress); - } else if (macAddress.startsWith("0x")) { - clockSeqAndNode |= MacAddress.parseLong(macAddress.substring(2)); - } - } else { - try { - byte[] local = InetAddress.getLocalHost().getAddress(); - clockSeqAndNode |= (local[0] << 24) & 0xFF000000L; - clockSeqAndNode |= (local[1] << 16) & 0xFF0000; - clockSeqAndNode |= (local[2] << 8) & 0xFF00; - clockSeqAndNode |= local[3] & 0xFF; - } catch (UnknownHostException ex) { - clockSeqAndNode |= (long)(Math.random() * 0x7FFFFFFF); - } - } - - s_address = new MacAddress(clockSeqAndNode); - } - - public static MacAddress getMacAddress() { - return s_address; - } - - private static String getFirstLineOfCommand(String[] commands) throws IOException { - - Process p = null; - BufferedReader reader = null; - - try { - p = Runtime.getRuntime().exec(commands); - reader = new BufferedReader(new InputStreamReader(p.getInputStream()), 128); - - return reader.readLine(); - } finally { - if (p != null) { - closeAutoCloseable(reader, "closing process input stream"); - closeAutoCloseable(p.getErrorStream(), "closing process error output stream"); - closeAutoCloseable(p.getOutputStream(), "closing process std output stream"); - p.destroy(); - } - } - - } - - /** - * The MAC address parser attempts to find the following patterns: - * <ul> - * <li>.{1,2}:.{1,2}:.{1,2}:.{1,2}:.{1,2}:.{1,2}</li> - * <li>.{1,2}-.{1,2}-.{1,2}-.{1,2}-.{1,2}-.{1,2}</li> - * </ul> - * - * This is copied from the author below. The author encouraged copying - * it. - * - */ - static String parse(String in) { - - // lanscan - - int hexStart = in.indexOf("0x"); - if (hexStart != -1) { - int hexEnd = in.indexOf(' ', hexStart); - if (hexEnd != -1) { - return in.substring(hexStart, hexEnd); - } - } - - int octets = 0; - int lastIndex, old, end; - - if (in.indexOf('-') > -1) { - in = in.replace('-', ':'); - } - - lastIndex = in.lastIndexOf(':'); - - if (lastIndex > in.length() - 2) - return null; - - end = Math.min(in.length(), lastIndex + 3); - - ++octets; - old = lastIndex; - while (octets != 5 && lastIndex != -1 && lastIndex > 1) { - lastIndex = in.lastIndexOf(':', --lastIndex); - if (old - lastIndex == 3 || old - lastIndex == 2) { - ++octets; - old = lastIndex; - } - } - - if (octets == 5 && lastIndex > 1) { - return in.substring(lastIndex - 2, end).trim(); - } - return null; - } - - public static void main(String[] args) { - MacAddress addr = MacAddress.getMacAddress(); - System.out.println("addr in integer is " + addr.toLong()); - System.out.println("addr in bytes is " + NumbersUtil.bytesToString(addr.toByteArray(), 0, addr.toByteArray().length)); - System.out.println("addr in char is " + addr.toString(":")); - } - - /** - * Parses a <code>long</code> from a hex encoded number. This method will skip - * all characters that are not 0-9 and a-f (the String is lower cased first). - * Returns 0 if the String does not contain any interesting characters. - * - * @param s the String to extract a <code>long</code> from, may not be <code>null</code> - * @return a <code>long</code> - * @throws NullPointerException if the String is <code>null</code> - */ - public static long parseLong(String s) throws NullPointerException { - s = s.toLowerCase(); - long out = 0; - byte shifts = 0; - char c; - for (int i = 0; i < s.length() && shifts < 16; i++) { - c = s.charAt(i); - if ((c > 47) && (c < 58)) { - out <<= 4; - ++shifts; - out |= c - 48; - } else if ((c > 96) && (c < 103)) { - ++shifts; - out <<= 4; - out |= c - 87; - } - } - return out; - } - - /** - * Parses an <code>int</code> from a hex encoded number. This method will skip - * all characters that are not 0-9 and a-f (the String is lower cased first). - * Returns 0 if the String does not contain any interesting characters. - * - * @param s the String to extract an <code>int</code> from, may not be <code>null</code> - * @return an <code>int</code> - * @throws NullPointerException if the String is <code>null</code> - */ - public static int parseInt(String s) throws NullPointerException { - s = s.toLowerCase(); - int out = 0; - byte shifts = 0; - char c; - for (int i = 0; i < s.length() && shifts < 8; i++) { - c = s.charAt(i); - if ((c > 47) && (c < 58)) { - out <<= 4; - ++shifts; - out |= c - 48; - } else if ((c > 96) && (c < 103)) { - ++shifts; - out <<= 4; - out |= c - 87; - } - } - return out; - } - - /** - * Parses a <code>short</code> from a hex encoded number. This method will skip - * all characters that are not 0-9 and a-f (the String is lower cased first). - * Returns 0 if the String does not contain any interesting characters. - * - * @param s the String to extract a <code>short</code> from, may not be <code>null</code> - * @return a <code>short</code> - * @throws NullPointerException if the String is <code>null</code> - */ - public static short parseShort(String s) throws NullPointerException { - s = s.toLowerCase(); - short out = 0; - byte shifts = 0; - char c; - for (int i = 0; i < s.length() && shifts < 4; i++) { - c = s.charAt(i); - if ((c > 47) && (c < 58)) { - out <<= 4; - ++shifts; - out |= c - 48; - } else if ((c > 96) && (c < 103)) { - ++shifts; - out <<= 4; - out |= c - 87; - } - } - return out; - } - - /** - * Parses a <code>byte</code> from a hex encoded number. This method will skip - * all characters that are not 0-9 and a-f (the String is lower cased first). - * Returns 0 if the String does not contain any interesting characters. - * - * @param s the String to extract a <code>byte</code> from, may not be <code>null</code> - * @return a <code>byte</code> - * @throws NullPointerException if the String is <code>null</code> - */ - public static byte parseByte(String s) throws NullPointerException { - s = s.toLowerCase(); - byte out = 0; - byte shifts = 0; - char c; - for (int i = 0; i < s.length() && shifts < 2; i++) { - c = s.charAt(i); - if ((c > 47) && (c < 58)) { - out <<= 4; - ++shifts; - out |= c - 48; - } else if ((c > 96) && (c < 103)) { - ++shifts; - out <<= 4; - out |= c - 87; - } - } - return out; - } -}
