| /******************************************************************************* |
| * Copyright (c) 2006 Oracle Corporation and others. |
| * All rights reserved. This program and the accompanying materials |
| * are made available under the terms of the Eclipse Public License v1.0 |
| * which accompanies this distribution, and is available at |
| * http://www.eclipse.org/legal/epl-v10.html |
| * |
| * Contributors: |
| * Oracle Corporation - initial API and implementation |
| *******************************************************************************/ |
| package org.eclipse.bpel.validator.model; |
| |
| /** |
| * Java JDK dependencies only please ... |
| */ |
| |
| import java.text.MessageFormat; |
| import java.util.Map; |
| import java.util.TreeMap; |
| |
| /** |
| * An implementation of IProblem. |
| * |
| * @author Michal Chmielewski (michal.chmielewski@oracle.com) |
| * @date Sep 18, 2006 |
| * |
| */ |
| |
| public class Problem implements IProblem { |
| |
| /** A counter to indicate the sequence no of the problem */ |
| static int ID = 1; |
| |
| /** The attributes of the problem, described in IProblem */ |
| Map<String,Object> mMap = new TreeMap<String,Object>(); |
| |
| /** When we were created */ |
| final long mCreated = System.currentTimeMillis(); |
| |
| /** Our ID */ |
| final long mId = ID++ ; |
| |
| /** |
| * The context object's class is used as a starting location |
| * for search of the appropriate message.properties file. |
| * |
| */ |
| Object fContext = null; |
| |
| |
| /** |
| * |
| */ |
| public Problem () { |
| |
| } |
| |
| /** |
| * @param context |
| */ |
| |
| public Problem ( Object context ) { |
| fContext = context; |
| } |
| |
| /** |
| * @see org.eclipse.bpel.validator.model.IProblem#getAttribute(java.lang.String) |
| */ |
| |
| @SuppressWarnings("unchecked") |
| public <T extends Object> T getAttribute (String attributeName) { |
| Object value = mMap.get(attributeName); |
| return (T) value; |
| } |
| |
| |
| /** |
| * @see org.eclipse.bpel.validator.model.IProblem#getAttribute(java.lang.String, java.lang.Object) |
| */ |
| @SuppressWarnings("unchecked") |
| public <T extends Object> T getAttribute(String attributeName, T defaultValue) { |
| Object value = mMap.get(attributeName); |
| if (value == null) { |
| return defaultValue; |
| } |
| return (T) value; |
| } |
| |
| /** (non-Javadoc) |
| * @see org.eclipse.bpel.validator.model.IProblem#setAttribute(java.lang.String, java.lang.Object) |
| */ |
| public <T> void setAttribute(String attributeName, T value) { |
| mMap.put(attributeName,value); |
| } |
| |
| |
| /** (non-Javadoc) |
| * @see org.eclipse.bpel.validator.model.IProblem#setAttributes(java.util.Map) |
| */ |
| public void setAttributes(Map<String, Object> attributes) { |
| mMap.clear(); |
| mMap.putAll( attributes ); |
| } |
| |
| |
| /** |
| * |
| * @see org.eclipse.bpel.validator.model.IProblem#getAttributes() |
| */ |
| public Map<String,Object> getAttributes() { |
| return mMap; |
| } |
| |
| /** |
| * @see org.eclipse.bpel.validator.model.IProblem#getCreationTime() |
| */ |
| public long getCreationTime() { |
| return mCreated; |
| } |
| |
| /** |
| * @see org.eclipse.bpel.validator.model.IProblem#getId() |
| */ |
| public long getId() { |
| return mId; |
| } |
| |
| /** |
| * Read all the information regarding the message into the problem |
| * |
| * @param msgId the message id |
| * @param args the arguments |
| */ |
| |
| public void fill ( String msgId, Object ... args ) { |
| |
| String key = msgId; |
| |
| for(int i=0; i < args.length; i++) { |
| args[i] = asArg (args[i]) ; |
| } |
| |
| setAttribute(IProblem.MESSAGE_ID, msgId); |
| setAttribute(IProblem.MESSAGE_ARGS, args ); |
| |
| String msgDef = Messages.missingKey(key); |
| String msg = getMessage(key,msgDef); |
| |
| try { |
| setAttribute (IProblem.MESSAGE, MessageFormat.format(msg, args) ); |
| } catch (Throwable t) { |
| setAttribute (IProblem.MESSAGE, MessageFormat.format(msgDef , t , t.getCause() ) ); |
| } |
| |
| key = msgId + ".fix"; //$NON-NLS-1$ |
| |
| // Fix if any. |
| msg = getMessage ( key, null ); |
| |
| if (msg != null) { |
| try { |
| setAttribute (IProblem.FIX, MessageFormat.format(msg, args) ); |
| } catch (Throwable t) { |
| setAttribute (IProblem.FIX, MessageFormat.format(Messages.missingKey(key), t, t.getCause() ) ); |
| } |
| } |
| // Error Code ? |
| } |
| |
| |
| @SuppressWarnings("nls") |
| Object asArg (Object o) { |
| if (o == null) { |
| return null; |
| } |
| |
| if (o.getClass().isArray()) { |
| StringBuilder sb = new StringBuilder ("{"); |
| Object oa[] = (Object[]) o; |
| for(int j=0; j < oa.length; j++) { |
| sb.append(oa[j]); |
| if (j+1 < oa.length) { |
| sb.append(","); |
| } |
| } |
| sb.append("}"); |
| return sb.toString(); |
| } else if (o.getClass() == String.class) { |
| String v = (String) o; |
| if (v.startsWith("text.")) { |
| return getMessage(v, v); |
| } |
| } |
| |
| return o ; |
| } |
| |
| /** |
| * Return the message to push into the IProblem. |
| * We consult the messages.properties located in current package. |
| * |
| * If that message is not found, we continue walking the superclass path |
| * and we don't examine Object for obvious reasons. |
| * |
| * The search path for the message id key (as specified by the key |
| * parameter) follows therefore the derivation structure of the class of the |
| * the context object. |
| * |
| * @param key |
| * @return the message |
| */ |
| |
| @SuppressWarnings("nls") |
| String getMessage ( String key , String def ) { |
| |
| if (fContext == null) { |
| return def; |
| } |
| Class<?> clazz = fContext.getClass(); |
| do { |
| String bundleName = clazz.getPackage().getName() + ".messages"; |
| Messages msg = Messages.getMessages( bundleName ); |
| if (msg.containsKey(key)) { |
| // Remember where the message came from, if not already set |
| if (mMap.containsKey(IProblem.BUNDLE_CLAZZ) == false) { |
| mMap.put(IProblem.BUNDLE_CLAZZ, clazz); |
| mMap.put(IProblem.BUNDLE_NAME, bundleName ); |
| } |
| // return the message |
| return msg.get(key); |
| } |
| clazz = clazz.getSuperclass(); |
| } while (clazz != null && clazz != Object.class); |
| |
| return def; |
| } |
| |
| } |