You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@ofbiz.apache.org by ad...@apache.org on 2010/01/01 01:38:57 UTC
svn commit: r894961 [2/4] - in /ofbiz/branches/executioncontext20091231: ./
applications/accounting/ applications/accounting/data/
applications/content/ applications/content/data/
applications/humanres/data/ applications/manufacturing/ applications/man...
Added: ofbiz/branches/executioncontext20091231/framework/api/src/org/ofbiz/api/context/ExecutionContext.java
URL: http://svn.apache.org/viewvc/ofbiz/branches/executioncontext20091231/framework/api/src/org/ofbiz/api/context/ExecutionContext.java?rev=894961&view=auto
==============================================================================
--- ofbiz/branches/executioncontext20091231/framework/api/src/org/ofbiz/api/context/ExecutionContext.java (added)
+++ ofbiz/branches/executioncontext20091231/framework/api/src/org/ofbiz/api/context/ExecutionContext.java Fri Jan 1 00:38:52 2010
@@ -0,0 +1,156 @@
+/*******************************************************************************
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ *******************************************************************************/
+package org.ofbiz.api.context;
+
+import java.util.Locale;
+import java.util.Map;
+import java.util.TimeZone;
+
+import org.ofbiz.api.authorization.AccessController;
+import org.ofbiz.api.authorization.AuthorizationManager;
+
+
+/** ExecutionContext interface. The <code>ExecutionContext</code> is a container
+ * for frequently used objects, plus it keeps track of the program's
+ * execution path. <p>As an object container, the <code>ExecutionContext</code>
+ * simplifies framework code - since only one oject needs to be
+ * passed around instead of five or six.</p><p>The <code>ExecutionContext</code>
+ * depends on the artifacts in the program's execution path to implement
+ * the <code>ExecutionArtifact</code> interface, or if that is not possible,
+ * to use a <code>GenericExecutionArtifact</code> instance. At the start of
+ * each method, the artifact calls <code>pushExecutionArtifact</code>, and
+ * as each method exits the artifact calls <code>popExecutionArtifact</code>.
+ * Implementations of this interface will pass the current execution path
+ * to the Authorization Manager so the proper user permissions can be
+ * retrieved for the current artifact.</p>
+ *
+ * @see org.ofbiz.api.context.ExecutionArtifact
+ * @see org.ofbiz.api.context.GenericExecutionArtifact
+ */
+public interface ExecutionContext {
+
+ /** Returns an <code>AccessController</code> instance for this
+ * user login and execution path combination.
+ *
+ * @return An <code>AccessController</code> instance
+ */
+ public AccessController getAccessController();
+
+ /** Returns the currency unit of measure.
+ *
+ * @return The ISO currency code
+ */
+ public String getCurrencyUom();
+
+ /** Returns the current execution path. Artifacts in the path are separated
+ * with a forward slash.
+ *
+ * @return The current execution path
+ */
+ public String getExecutionPath();
+
+ /** Returns the current <code>Locale</code>.
+ *
+ * @return The current <code>Locale</code>
+ */
+ public Locale getLocale();
+
+ /**
+ * Returns the parameters associated with this context.
+ *
+ * @return The parameters associated with this context
+ */
+ public Map<String, ? extends Object> getParameters();
+
+ /** Returns the specified property.
+ *
+ * @param key property whose associated value is to be returned
+ * @return the specified property, or null if the property doesn't exist
+ */
+ public Object getProperty(String key);
+
+ /** Returns the current <code>AuthorizationManager</code> instance.
+ *
+ * @return The current <code>AuthorizationManager</code> instance
+ */
+ public AuthorizationManager getSecurity();
+
+ /** Returns the current <code>TimeZone</code>.
+ *
+ * @return The current <code>TimeZone</code>
+ */
+ public TimeZone getTimeZone();
+
+ /** Initializes this ExecutionContext with artifacts found in
+ * <code>params</code>.
+ *
+ * @param params
+ */
+ public void initializeContext(Map<String, ? extends Object> params);
+
+ /** Pop an <code>ExecutionArtifact</code> off the stack. */
+ public void popExecutionArtifact();
+
+ /** Push an <code>ExecutionArtifact</code> on the stack.
+ *
+ * @param artifact
+ */
+ public void pushExecutionArtifact(ExecutionArtifact artifact);
+
+ /**
+ * Resets this <code>ExecutionContext</code> to its default
+ * state. This method is called when an <code>ExecutionContext</code>
+ * instance is about to be reused.
+ */
+ public void reset();
+
+ /** Sets the currency unit of measure.
+ *
+ * @param currencyUom The ISO currency code
+ */
+ public void setCurrencyUom(String currencyUom);
+
+ /** Sets the current <code>Locale</code>.
+ *
+ * @param locale The current <code>Locale</code>
+ */
+ public void setLocale(Locale locale);
+
+ /** Associates the specified value with the specified key.
+ * If the context contained a previous property for this key,
+ * then the old value is replaced by the specified value.
+ *
+ * @param key the key with which the specified value is to be associated
+ * @param value the value to be associated with the specified key
+ * @return the previous value associated with specified key, or null if there was no mapping for key
+ */
+ public Object setProperty(String key, Object value);
+
+ /** Sets the current <code>AuthorizationManager</code> instance.
+ *
+ * @param security The new <code>AuthorizationManager</code> instance
+ */
+ public void setSecurity(AuthorizationManager security);
+
+ /** Sets the current <code>TimeZone</code>.
+ *
+ * @param timeZone The current <code>TimeZone</code>
+ */
+ public void setTimeZone(TimeZone timeZone);
+}
Propchange: ofbiz/branches/executioncontext20091231/framework/api/src/org/ofbiz/api/context/ExecutionContext.java
------------------------------------------------------------------------------
svn:eol-style = native
Propchange: ofbiz/branches/executioncontext20091231/framework/api/src/org/ofbiz/api/context/ExecutionContext.java
------------------------------------------------------------------------------
svn:keywords = "Date Rev Author URL Id"
Propchange: ofbiz/branches/executioncontext20091231/framework/api/src/org/ofbiz/api/context/ExecutionContext.java
------------------------------------------------------------------------------
svn:mime-type = text/plain
Added: ofbiz/branches/executioncontext20091231/framework/api/src/org/ofbiz/api/context/ExecutionContextImpl.java
URL: http://svn.apache.org/viewvc/ofbiz/branches/executioncontext20091231/framework/api/src/org/ofbiz/api/context/ExecutionContextImpl.java?rev=894961&view=auto
==============================================================================
--- ofbiz/branches/executioncontext20091231/framework/api/src/org/ofbiz/api/context/ExecutionContextImpl.java (added)
+++ ofbiz/branches/executioncontext20091231/framework/api/src/org/ofbiz/api/context/ExecutionContextImpl.java Fri Jan 1 00:38:52 2010
@@ -0,0 +1,175 @@
+/*******************************************************************************
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ *******************************************************************************/
+package org.ofbiz.api.context;
+
+import java.util.Locale;
+import java.util.Map;
+import java.util.TimeZone;
+
+import javolution.util.FastList;
+import javolution.util.FastMap;
+
+import org.ofbiz.base.util.Debug;
+import org.ofbiz.base.util.UtilProperties;
+
+/** Implementation of the ExecutionContext interface. */
+public abstract class ExecutionContextImpl implements ExecutionContext {
+
+ public static final String module = ExecutionContextImpl.class.getName();
+
+ protected final FastList<ExecutionArtifact> artifactStack = FastList.newInstance();
+ protected String currencyUom = null;
+ protected Locale locale = Locale.getDefault();
+ protected TimeZone timeZone = TimeZone.getDefault();
+ protected final Map<String, Object> properties;
+ // Temporary - will be removed later
+ protected boolean verbose = false;
+
+ protected ExecutionContextImpl() {
+ this.properties = FastMap.newInstance();
+ this.verbose = "true".equals(UtilProperties.getPropertyValue("api.properties", "executionContext.verbose"));
+ }
+
+ protected ExecutionContextImpl(Map<String, Object> properties) {
+ this.properties = properties;
+ this.verbose = "true".equals(UtilProperties.getPropertyValue("api.properties", "executionContext.verbose"));
+ }
+
+ @Override
+ protected void finalize() throws Throwable {
+ if (this.artifactStack.size() > 0) {
+ // This check is temporary - it will be removed when implementation is complete
+ Debug.logError(new Exception("finalize() called with a stack that is not empty"), module);
+ return;
+ }
+ super.finalize();
+ }
+
+ public String getCurrencyUom() {
+ return this.currencyUom;
+ }
+
+ public String getExecutionPath() {
+ StringBuilder sb = new StringBuilder("ofbiz");
+ for (ExecutionArtifact artifact : this.artifactStack) {
+ sb.append("/");
+ sb.append(artifact.getName() == null ? "null" : artifact.getName());
+ }
+ return sb.toString();
+ }
+
+ public Locale getLocale() {
+ return this.locale;
+ }
+
+ public Map<String, ? extends Object> getParameters() {
+ for (int i = this.artifactStack.size() - 1; i >= 0; i--) {
+ try {
+ ParametersArtifact artifact = (ParametersArtifact) this.artifactStack.get(i);
+ return artifact.getParameters();
+ } catch (Exception e) {}
+ }
+ return null;
+ }
+
+ public Object getProperty(String key) {
+ return this.properties.get(key);
+ }
+
+ public TimeZone getTimeZone() {
+ return this.timeZone;
+ }
+
+ public void popExecutionArtifact() {
+ if (this.artifactStack.size() == 0) {
+ // This check is temporary - it will be removed when implementation is complete
+ Debug.logError(new Exception("Attempt to pop an empty stack"), module);
+ return;
+ }
+ ExecutionArtifact artifact = this.artifactStack.removeLast();
+ if (this.verbose) {
+ Debug.logInfo("Popping artifact [" + artifact.getClass().getName() +
+ "] location = " + artifact.getLocation() +
+ ", name = " + artifact.getName(), module);
+ }
+ }
+
+ public void pushExecutionArtifact(ExecutionArtifact artifact) {
+ this.artifactStack.addLast(artifact);
+ if (this.verbose) {
+ Debug.logInfo("Pushing artifact [" + artifact.getClass().getName() +
+ "] location = " + artifact.getLocation() +
+ ", name = " + artifact.getName(), module);
+ }
+ }
+
+ public void reset() {
+ if (this.verbose) {
+ Debug.logInfo("Resetting ExecutionContext", module);
+ }
+ this.artifactStack.clear();
+ this.currencyUom = "";
+ this.locale = Locale.getDefault();
+ this.properties.clear();
+ this.timeZone = TimeZone.getDefault();
+ }
+
+ public void setCurrencyUom(String currencyUom) {
+ if (currencyUom != null) {
+ this.currencyUom = currencyUom;
+ }
+ }
+
+ public void setLocale(Locale locale) {
+ if (locale != null) {
+ this.locale = locale;
+ }
+ }
+
+ protected void setLocale(String locale) {
+ if (locale != null) {
+ this.locale = new Locale(locale);
+ } else {
+ this.locale = Locale.getDefault();
+ }
+ }
+
+ public Object setProperty(String key, Object value) {
+ return this.properties.put(key, value);
+ }
+
+ public void setTimeZone(TimeZone timeZone) {
+ if (timeZone != null) {
+ this.timeZone = timeZone;
+ }
+ }
+
+ protected void setTimeZone(String timeZone) {
+ if (timeZone != null) {
+ this.timeZone = TimeZone.getTimeZone(timeZone);
+ } else {
+ this.timeZone = TimeZone.getDefault();
+ }
+ }
+
+ @Override
+ public String toString() {
+ return this.getExecutionPath();
+ }
+}
Propchange: ofbiz/branches/executioncontext20091231/framework/api/src/org/ofbiz/api/context/ExecutionContextImpl.java
------------------------------------------------------------------------------
svn:eol-style = native
Propchange: ofbiz/branches/executioncontext20091231/framework/api/src/org/ofbiz/api/context/ExecutionContextImpl.java
------------------------------------------------------------------------------
svn:keywords = "Date Rev Author URL Id"
Propchange: ofbiz/branches/executioncontext20091231/framework/api/src/org/ofbiz/api/context/ExecutionContextImpl.java
------------------------------------------------------------------------------
svn:mime-type = text/plain
Added: ofbiz/branches/executioncontext20091231/framework/api/src/org/ofbiz/api/context/GenericExecutionArtifact.java
URL: http://svn.apache.org/viewvc/ofbiz/branches/executioncontext20091231/framework/api/src/org/ofbiz/api/context/GenericExecutionArtifact.java?rev=894961&view=auto
==============================================================================
--- ofbiz/branches/executioncontext20091231/framework/api/src/org/ofbiz/api/context/GenericExecutionArtifact.java (added)
+++ ofbiz/branches/executioncontext20091231/framework/api/src/org/ofbiz/api/context/GenericExecutionArtifact.java Fri Jan 1 00:38:52 2010
@@ -0,0 +1,44 @@
+/*******************************************************************************
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ *******************************************************************************/
+package org.ofbiz.api.context;
+
+/** A basic implementation of the <code>ExecutionArtifact</code> interface. */
+public class GenericExecutionArtifact implements ExecutionArtifact {
+
+ protected final String location;
+ protected final String name;
+
+ public GenericExecutionArtifact(String location, String name) {
+ this.location = location;
+ this.name = name;
+ }
+
+ public String getLocation() {
+ return this.location;
+ }
+
+ public String getName() {
+ return this.name;
+ }
+
+ @Override
+ public String toString() {
+ return "GenericExecutionArtifact: location = " + this.location + ", name = " + this.name;
+ }
+}
Propchange: ofbiz/branches/executioncontext20091231/framework/api/src/org/ofbiz/api/context/GenericExecutionArtifact.java
------------------------------------------------------------------------------
svn:eol-style = native
Propchange: ofbiz/branches/executioncontext20091231/framework/api/src/org/ofbiz/api/context/GenericExecutionArtifact.java
------------------------------------------------------------------------------
svn:keywords = "Date Rev Author URL Id"
Propchange: ofbiz/branches/executioncontext20091231/framework/api/src/org/ofbiz/api/context/GenericExecutionArtifact.java
------------------------------------------------------------------------------
svn:mime-type = text/plain
Added: ofbiz/branches/executioncontext20091231/framework/api/src/org/ofbiz/api/context/GenericParametersArtifact.java
URL: http://svn.apache.org/viewvc/ofbiz/branches/executioncontext20091231/framework/api/src/org/ofbiz/api/context/GenericParametersArtifact.java?rev=894961&view=auto
==============================================================================
--- ofbiz/branches/executioncontext20091231/framework/api/src/org/ofbiz/api/context/GenericParametersArtifact.java (added)
+++ ofbiz/branches/executioncontext20091231/framework/api/src/org/ofbiz/api/context/GenericParametersArtifact.java Fri Jan 1 00:38:52 2010
@@ -0,0 +1,46 @@
+/*******************************************************************************
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ *******************************************************************************/
+package org.ofbiz.api.context;
+
+import java.util.Map;
+
+/** A basic implementation of the ParametersArtifact interface. */
+public class GenericParametersArtifact extends GenericExecutionArtifact implements ParametersArtifact {
+
+ protected final Map<String, ? extends Object> parameters;
+
+ public GenericParametersArtifact(String location, String name, Map<String, ? extends Object> parameters) {
+ super(location, name);
+ this.parameters = parameters;
+ }
+
+ public GenericParametersArtifact(ExecutionArtifact artifact, Map<String, ? extends Object> parameters) {
+ super(artifact.getLocation(), artifact.getName());
+ this.parameters = parameters;
+ }
+
+ public Map<String, ? extends Object> getParameters() {
+ return this.parameters;
+ }
+
+ @Override
+ public String toString() {
+ return "GenericParametersArtifact: location = " + this.location + ", name = " + this.name;
+ }
+}
Propchange: ofbiz/branches/executioncontext20091231/framework/api/src/org/ofbiz/api/context/GenericParametersArtifact.java
------------------------------------------------------------------------------
svn:eol-style = native
Propchange: ofbiz/branches/executioncontext20091231/framework/api/src/org/ofbiz/api/context/GenericParametersArtifact.java
------------------------------------------------------------------------------
svn:keywords = "Date Rev Author URL Id"
Propchange: ofbiz/branches/executioncontext20091231/framework/api/src/org/ofbiz/api/context/GenericParametersArtifact.java
------------------------------------------------------------------------------
svn:mime-type = text/plain
Added: ofbiz/branches/executioncontext20091231/framework/api/src/org/ofbiz/api/context/ParametersArtifact.java
URL: http://svn.apache.org/viewvc/ofbiz/branches/executioncontext20091231/framework/api/src/org/ofbiz/api/context/ParametersArtifact.java?rev=894961&view=auto
==============================================================================
--- ofbiz/branches/executioncontext20091231/framework/api/src/org/ofbiz/api/context/ParametersArtifact.java (added)
+++ ofbiz/branches/executioncontext20091231/framework/api/src/org/ofbiz/api/context/ParametersArtifact.java Fri Jan 1 00:38:52 2010
@@ -0,0 +1,48 @@
+/*******************************************************************************
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ *******************************************************************************/
+package org.ofbiz.api.context;
+
+import java.util.Map;
+
+/** ParametersArtifact interface. This interface extends
+ * <code>ExecutionArtifact</code> and adds the ability to
+ * contain a parameter <code>Map</code>.<p>The purpose of this
+ * class is to provide a way for the <code>ExecutionContext</code>
+ * to keep track of what parameters are the most recent. For
+ * example: Service A calls Service B. Service A has one set of
+ * parameters, and Service B has another set of parameters. During
+ * program execution, Service A creates a <code>ParametersArtifact</code>
+ * instance that contains the service's parameters, then pushes that
+ * instance on the <code>ExecutionContext</code> stack. When Service B
+ * is called, it does the same thing. When framework code needs to
+ * access the current parameters, it calls
+ * <code>ExecutionContext.getParameters()</code>. The <code>ExecutionContext</code>
+ * will search its stack for the first <code>ParametersArtifact</code> instance -
+ * starting at the top of the stack, and return that instance.</p>
+ */
+public interface ParametersArtifact extends ExecutionArtifact {
+
+ /**
+ * Returns the parameters associated with this artifact.
+ *
+ * @return The parameters associated with this artifact
+ */
+ public Map<String, ? extends Object> getParameters();
+
+}
Propchange: ofbiz/branches/executioncontext20091231/framework/api/src/org/ofbiz/api/context/ParametersArtifact.java
------------------------------------------------------------------------------
svn:eol-style = native
Propchange: ofbiz/branches/executioncontext20091231/framework/api/src/org/ofbiz/api/context/ParametersArtifact.java
------------------------------------------------------------------------------
svn:keywords = "Date Rev Author URL Id"
Propchange: ofbiz/branches/executioncontext20091231/framework/api/src/org/ofbiz/api/context/ParametersArtifact.java
------------------------------------------------------------------------------
svn:mime-type = text/plain
Added: ofbiz/branches/executioncontext20091231/framework/api/src/org/ofbiz/api/context/ThreadContext.java
URL: http://svn.apache.org/viewvc/ofbiz/branches/executioncontext20091231/framework/api/src/org/ofbiz/api/context/ThreadContext.java?rev=894961&view=auto
==============================================================================
--- ofbiz/branches/executioncontext20091231/framework/api/src/org/ofbiz/api/context/ThreadContext.java (added)
+++ ofbiz/branches/executioncontext20091231/framework/api/src/org/ofbiz/api/context/ThreadContext.java Fri Jan 1 00:38:52 2010
@@ -0,0 +1,153 @@
+/*******************************************************************************
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ *******************************************************************************/
+package org.ofbiz.api.context;
+
+import java.util.Locale;
+import java.util.Map;
+import java.util.TimeZone;
+
+import org.ofbiz.api.authorization.AccessController;
+import org.ofbiz.api.authorization.AuthorizationManager;
+import org.ofbiz.api.authorization.NullAuthorizationManager;
+import org.ofbiz.base.util.Debug;
+import org.ofbiz.base.util.UtilProperties;
+
+/** A convenience class for accessing the current thread's <code>ExecutionContext</code>.
+ * @see {@link org.ofbiz.service.ExecutionContext}
+ */
+public class ThreadContext {
+
+ protected static final String module = ThreadContext.class.getName();
+ protected static final AuthorizationManager nullAuthorizationManager = new NullAuthorizationManager();
+
+ protected static final ThreadLocal<ExecutionContext> executionContext = new ThreadLocal<ExecutionContext>() {
+ protected synchronized ExecutionContext initialValue() {
+ ExecutionContext result = null;
+ ClassLoader loader = Thread.currentThread().getContextClassLoader();
+ String className = UtilProperties.getPropertyValue("api.properties", "executionContext.class");
+ try {
+ result = (ExecutionContext) loader.loadClass(className).newInstance();
+ } catch (Exception e) {
+ Debug.logError(e, module);
+ }
+ return result;
+ }
+ };
+
+ /** Used by <code>runUnprotected</code> and <code>endRunUnprotected</code>
+ * to save/restore the original <code>AuthorizationManager</code> instance.
+ */
+ protected static final ThreadLocal<AuthorizationManager> authManager = new ThreadLocal<AuthorizationManager>() {
+ protected synchronized AuthorizationManager initialValue() {return null;};
+ };
+
+ public static void endRunUnprotected() {
+ AuthorizationManager savedAuthorizationManager = authManager.get();
+ if (savedAuthorizationManager != null) {
+ setSecurity(savedAuthorizationManager);
+ authManager.set(null);
+ }
+ }
+
+ public static AccessController getAccessController() {
+ return executionContext.get().getAccessController();
+ }
+
+ public static String getCurrencyUom() {
+ return executionContext.get().getCurrencyUom();
+ }
+
+ public static String getExecutionPath() {
+ return executionContext.get().getExecutionPath();
+ }
+
+ public static Locale getLocale() {
+ return executionContext.get().getLocale();
+ }
+
+ public static Map<String, ? extends Object> getParameters() {
+ return executionContext.get().getParameters();
+ }
+
+ public static Object getProperty(String key) {
+ return executionContext.get().getProperty(key);
+ }
+
+ public static AuthorizationManager getSecurity() {
+ return executionContext.get().getSecurity();
+ }
+
+ public static TimeZone getTimeZone() {
+ return executionContext.get().getTimeZone();
+ }
+
+ public static void initializeContext(Map<String, ? extends Object> params) {
+ executionContext.get().initializeContext(params);
+ }
+
+ public static void popExecutionArtifact() {
+ executionContext.get().popExecutionArtifact();
+ }
+
+ public static void pushExecutionArtifact(ExecutionArtifact artifact) {
+ executionContext.get().pushExecutionArtifact(artifact);
+ }
+
+ public static void pushExecutionArtifact(ExecutionArtifact artifact, Map<String, ? extends Object> parameters) {
+ pushExecutionArtifact(new GenericParametersArtifact(artifact, parameters));
+ }
+
+ public static void pushExecutionArtifact(String location, String name) {
+ pushExecutionArtifact(new GenericExecutionArtifact(location, name));
+ }
+
+ public static void pushExecutionArtifact(String location, String name, Map<String, ? extends Object> parameters) {
+ pushExecutionArtifact(new GenericParametersArtifact(location, name, parameters));
+ }
+
+ public static void reset() {
+ executionContext.get().reset();
+ }
+
+ public static void runUnprotected() {
+ authManager.set(getSecurity());
+ setSecurity(nullAuthorizationManager);
+ }
+
+ public static void setCurrencyUom(String currencyUom) {
+ executionContext.get().setCurrencyUom(currencyUom);
+ }
+
+ public static void setLocale(Locale locale) {
+ executionContext.get().setLocale(locale);
+ }
+
+ public static Object setProperty(String key, Object value) {
+ return executionContext.get().setProperty(key, value);
+ }
+
+ public static void setSecurity(AuthorizationManager security) {
+ executionContext.get().setSecurity(security);
+ }
+
+ public static void setTimeZone(TimeZone timeZone) {
+ executionContext.get().setTimeZone(timeZone);
+ }
+
+}
Propchange: ofbiz/branches/executioncontext20091231/framework/api/src/org/ofbiz/api/context/ThreadContext.java
------------------------------------------------------------------------------
svn:eol-style = native
Propchange: ofbiz/branches/executioncontext20091231/framework/api/src/org/ofbiz/api/context/ThreadContext.java
------------------------------------------------------------------------------
svn:keywords = "Date Rev Author URL Id"
Propchange: ofbiz/branches/executioncontext20091231/framework/api/src/org/ofbiz/api/context/ThreadContext.java
------------------------------------------------------------------------------
svn:mime-type = text/plain
Modified: ofbiz/branches/executioncontext20091231/framework/bi/build.xml
URL: http://svn.apache.org/viewvc/ofbiz/branches/executioncontext20091231/framework/bi/build.xml?rev=894961&r1=894960&r2=894961&view=diff
==============================================================================
--- ofbiz/branches/executioncontext20091231/framework/bi/build.xml (original)
+++ ofbiz/branches/executioncontext20091231/framework/bi/build.xml Fri Jan 1 00:38:52 2010
@@ -29,6 +29,7 @@
<property name="name" value="ofbiz-bi"/>
<path id="local.class.path">
+ <fileset dir="../../framework/api/build/lib" includes="*.jar"/>
<fileset dir="../../framework/base/lib" includes="*.jar"/>
<fileset dir="../../framework/base/lib/commons" includes="*.jar"/>
<fileset dir="../../framework/base/lib/j2eespecs" includes="*.jar"/>
Modified: ofbiz/branches/executioncontext20091231/framework/build.xml
URL: http://svn.apache.org/viewvc/ofbiz/branches/executioncontext20091231/framework/build.xml?rev=894961&r1=894960&r2=894961&view=diff
==============================================================================
--- ofbiz/branches/executioncontext20091231/framework/build.xml (original)
+++ ofbiz/branches/executioncontext20091231/framework/build.xml Fri Jan 1 00:38:52 2010
@@ -22,10 +22,10 @@
<import file="../macros.xml"/>
<filelist id="framework-builds" dir="."
- files="start/build.xml,base/build.xml,sql/build.xml,
+ files="start/build.xml,base/build.xml,api/build.xml,sql/build.xml,
entity/build.xml,geronimo/build.xml,
catalina/build.xml,jetty/build.xml,
- security/build.xml,service/build.xml,entityext/build.xml,
+ security/build.xml,service/build.xml,context/build.xml,entityext/build.xml,
webslinger/build.xml,
bi/build.xml,minilang/build.xml,
webapp/build.xml,guiapp/build.xml,widget/build.xml,
Modified: ofbiz/branches/executioncontext20091231/framework/common/build.xml
URL: http://svn.apache.org/viewvc/ofbiz/branches/executioncontext20091231/framework/common/build.xml?rev=894961&r1=894960&r2=894961&view=diff
==============================================================================
--- ofbiz/branches/executioncontext20091231/framework/common/build.xml (original)
+++ ofbiz/branches/executioncontext20091231/framework/common/build.xml Fri Jan 1 00:38:52 2010
@@ -30,6 +30,7 @@
<property name="ofbiz.home.dir" value="../.."/>
<path id="local.class.path">
+ <fileset dir="../api/build/lib" includes="*.jar"/>
<fileset dir="../base/lib" includes="*.jar"/>
<fileset dir="../base/lib/commons" includes="*.jar"/>
<fileset dir="../base/lib/j2eespecs" includes="*.jar"/>
Modified: ofbiz/branches/executioncontext20091231/framework/common/src/org/ofbiz/common/login/LoginServices.java
URL: http://svn.apache.org/viewvc/ofbiz/branches/executioncontext20091231/framework/common/src/org/ofbiz/common/login/LoginServices.java?rev=894961&r1=894960&r2=894961&view=diff
==============================================================================
--- ofbiz/branches/executioncontext20091231/framework/common/src/org/ofbiz/common/login/LoginServices.java (original)
+++ ofbiz/branches/executioncontext20091231/framework/common/src/org/ofbiz/common/login/LoginServices.java Fri Jan 1 00:38:52 2010
@@ -53,6 +53,7 @@
import org.ofbiz.service.LocalDispatcher;
import org.ofbiz.service.ModelService;
import org.ofbiz.service.ServiceUtil;
+import org.ofbiz.service.ThreadContext;
import org.ofbiz.webapp.control.LoginWorker;
/**
@@ -233,6 +234,7 @@
}
successfulLogin = "Y";
+ ThreadContext.setUserLogin(userLogin);
if (!isServiceAuth) {
// get the UserLoginSession if this is not a service auth
@@ -410,6 +412,7 @@
userLogin.set("userLoginId", username);
userLogin.set("enabled", "Y");
userLogin.set("hasLoggedOut", "N");
+ ThreadContext.setUserLogin(userLogin);
result.put("userLogin", userLogin);
result.put(ModelService.RESPONSE_MESSAGE, ModelService.RESPOND_SUCCESS);
//TODO: more than this is needed to support 100% external authentication
Modified: ofbiz/branches/executioncontext20091231/framework/component-load.xml
URL: http://svn.apache.org/viewvc/ofbiz/branches/executioncontext20091231/framework/component-load.xml?rev=894961&r1=894960&r2=894961&view=diff
==============================================================================
--- ofbiz/branches/executioncontext20091231/framework/component-load.xml (original)
+++ ofbiz/branches/executioncontext20091231/framework/component-load.xml Fri Jan 1 00:38:52 2010
@@ -20,6 +20,8 @@
<component-loader xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:noNamespaceSchemaLocation="http://ofbiz.apache.org/dtds/component-loader.xsd">
+ <load-component component-location="api"/>
+ <load-component component-location="context"/>
<load-component component-location="geronimo"/>
<load-component component-location="sql"/>
<load-component component-location="entity"/>
Added: ofbiz/branches/executioncontext20091231/framework/context/build.xml
URL: http://svn.apache.org/viewvc/ofbiz/branches/executioncontext20091231/framework/context/build.xml?rev=894961&view=auto
==============================================================================
--- ofbiz/branches/executioncontext20091231/framework/context/build.xml (added)
+++ ofbiz/branches/executioncontext20091231/framework/context/build.xml Fri Jan 1 00:38:52 2010
@@ -0,0 +1,72 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+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.
+-->
+
+<project name="OFBiz - Execution Context" default="jar" basedir=".">
+ <import file="../../common.xml"/>
+
+ <!-- ================================================================== -->
+ <!-- Initialization of all property settings -->
+ <!-- ================================================================== -->
+
+ <property name="name" value="ofbiz-context"/>
+ <property name="ofbiz.home.dir" value="../.."/>
+
+ <path id="local.class.path">
+ <fileset dir="../api/build/lib" includes="*.jar"/>
+ <fileset dir="${lib.dir}" includes="*.jar"/>
+ <fileset dir="../base/lib" includes="*.jar"/>
+ <fileset dir="../base/lib/commons" includes="*.jar"/>
+ <fileset dir="../base/lib/j2eespecs" includes="*.jar"/>
+ <fileset dir="../base/lib/scripting" includes="*.jar"/>
+ <fileset dir="../base/build/lib" includes="*.jar"/>
+ <fileset dir="../entity/build/lib" includes="*.jar"/>
+ <fileset dir="../security/build/lib" includes="*.jar"/>
+ <fileset dir="../service/build/lib" includes="*.jar"/>
+ </path>
+
+ <!-- ================================================================== -->
+ <!-- Compilation of the source files -->
+ <!-- ================================================================== -->
+
+ <target name="jar" depends="classes">
+ <jar jarfile="${build.dir}/lib/${name}.jar">
+ <fileset dir="${build.dir}/classes"/>
+ <fileset dir="${src.dir}">
+ <include name="**/*.properties,**/*.xml,**/*.bsh,**/*.logic,**/*.js,**/*.jacl,**/*.py"/>
+ <include name="META-INF/**"/>
+ </fileset>
+ <!-- now add the NOTICE and LICENSE files to allow the jar file to be distributed alone -->
+ <zipfileset dir="${ofbiz.home.dir}" prefix="META-INF" includes="NOTICE,LICENSE"/>
+ </jar>
+ </target>
+
+ <!-- ================================================================== -->
+ <!-- Build JavaDoc -->
+ <!-- ================================================================== -->
+
+ <target name="docs" depends="prepare-docs">
+ <javadoc packagenames="org.ofbiz.base.*"
+ classpathref="local.class.path"
+ destdir="${build.dir}/javadocs"
+ Windowtitle="Open for Business - Execution Context">
+ <sourcepath path="${src.dir}"/>
+ </javadoc>
+ </target>
+</project>
Added: ofbiz/branches/executioncontext20091231/framework/context/ofbiz-component.xml
URL: http://svn.apache.org/viewvc/ofbiz/branches/executioncontext20091231/framework/context/ofbiz-component.xml?rev=894961&view=auto
==============================================================================
--- ofbiz/branches/executioncontext20091231/framework/context/ofbiz-component.xml (added)
+++ ofbiz/branches/executioncontext20091231/framework/context/ofbiz-component.xml Fri Jan 1 00:38:52 2010
@@ -0,0 +1,28 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+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.
+-->
+
+<ofbiz-component name="context"
+ xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+ xsi:noNamespaceSchemaLocation="http://ofbiz.apache.org/dtds/ofbiz-component.xsd">
+ <resource-loader name="main" type="component"/>
+ <classpath type="jar" location="build/lib/*"/>
+ <classpath type="dir" location="config"/>
+ <classpath type="jar" location="lib/*"/>
+</ofbiz-component>
Added: ofbiz/branches/executioncontext20091231/framework/context/src/org/ofbiz/context/AccessControllerImpl.java
URL: http://svn.apache.org/viewvc/ofbiz/branches/executioncontext20091231/framework/context/src/org/ofbiz/context/AccessControllerImpl.java?rev=894961&view=auto
==============================================================================
--- ofbiz/branches/executioncontext20091231/framework/context/src/org/ofbiz/context/AccessControllerImpl.java (added)
+++ ofbiz/branches/executioncontext20091231/framework/context/src/org/ofbiz/context/AccessControllerImpl.java Fri Jan 1 00:38:52 2010
@@ -0,0 +1,129 @@
+/*******************************************************************************
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ *******************************************************************************/
+package org.ofbiz.context;
+
+import java.security.AccessControlException;
+import java.security.Permission;
+import java.util.List;
+import java.util.ListIterator;
+import java.util.Map;
+
+import javolution.util.FastMap;
+
+import org.ofbiz.api.authorization.AccessController;
+import org.ofbiz.base.util.Debug;
+import org.ofbiz.base.util.UtilProperties;
+import org.ofbiz.entity.util.EntityListIterator;
+import org.ofbiz.service.DispatchContext;
+import org.ofbiz.service.ThreadContext;
+import org.ofbiz.service.LocalDispatcher;
+import org.ofbiz.service.ModelService;
+
+/** An implementation of the <code>AccessController</code> interface. */
+public class AccessControllerImpl implements AccessController {
+
+ public static final String module = AccessControllerImpl.class.getName();
+
+ protected final OFBizPermission permission;
+ protected final PathNode node;
+ // Temporary - will be removed later
+ protected boolean verbose = false;
+ protected boolean disabled = false;
+
+ protected AccessControllerImpl(PathNode node) {
+ this.node = node;
+ this.permission = new OFBizPermission(ThreadContext.getUserLogin().getString("userLoginId"));
+ this.verbose = "true".equals(UtilProperties.getPropertyValue("api.properties", "authorizationManager.verbose"));
+ this.disabled = "true".equals(UtilProperties.getPropertyValue("api.properties", "authorizationManager.disabled"));
+ }
+
+ public void checkPermission(Permission permission) throws AccessControlException {
+ if (this.verbose) {
+ Debug.logInfo("Checking permission: " + ThreadContext.getExecutionPath() + "[" + permission + "]", module);
+ }
+ this.permission.reset();
+ this.node.getPermissions(ThreadContext.getExecutionPath(), this.permission);
+ if (this.verbose) {
+ Debug.logInfo("Found permission(s): " + ThreadContext.getUserLogin().getString("userLoginId") +
+ "@" + ThreadContext.getExecutionPath() + "[" + this.permission + "]", module);
+ }
+ if (this.disabled) {
+ return;
+ }
+ if (this.permission.implies(permission) && this.hasServicePermission()) {
+ return;
+ }
+ throw new AccessControlException(ThreadContext.getUserLogin().getString("userLoginId") +
+ "@" + ThreadContext.getExecutionPath() + "[" + permission + "]");
+ }
+
+ public <E> List<E> applyFilters(List<E> list) {
+ if (this.permission.getFilterNames().size() > 0) {
+ return new SecurityAwareList<E>(list, this.permission.getFilterNames());
+ }
+ return list;
+ }
+
+ public <E> ListIterator<E> applyFilters(ListIterator<E> listIterator) {
+ if (listIterator instanceof EntityListIterator) {
+ // Decorating the EntityListIterator breaks a lot of code.
+ return listIterator;
+ }
+ if (this.permission.getFilterNames().size() > 0) {
+ return new SecurityAwareListIterator<E>(listIterator, this.permission.getFilterNames());
+ }
+ return listIterator;
+ }
+
+ protected boolean hasServicePermission() {
+ try {
+ if (this.permission.getServiceNames().size() == 0) {
+ return true;
+ }
+ LocalDispatcher dispatcher = ThreadContext.getDispatcher();
+ DispatchContext ctx = dispatcher.getDispatchContext();
+ Map<String, ? extends Object> params = ThreadContext.getParameters();
+ for (String serviceName : this.permission.getServiceNames()) {
+ ModelService modelService = ctx.getModelService(serviceName);
+ Map<String, Object> context = FastMap.newInstance();
+ if (params != null) {
+ context.putAll(params);
+ }
+ if (!context.containsKey("userLogin")) {
+ context.put("userLogin", ThreadContext.getUserLogin());
+ }
+ if (!context.containsKey("locale")) {
+ context.put("locale", ThreadContext.getLocale());
+ }
+ if (!context.containsKey("timeZone")) {
+ context.put("timeZone", ThreadContext.getTimeZone());
+ }
+ context = modelService.makeValid(context, ModelService.IN_PARAM);
+ Map<String, Object> result = dispatcher.runSync(serviceName, context);
+ Boolean hasPermission = (Boolean) result.get("hasPermission");
+ if (hasPermission != null && !hasPermission.booleanValue()) {
+ return false;
+ }
+ }
+ } catch (Exception e) {
+ Debug.logError(e, module);
+ }
+ return true;
+ }
+}
Propchange: ofbiz/branches/executioncontext20091231/framework/context/src/org/ofbiz/context/AccessControllerImpl.java
------------------------------------------------------------------------------
svn:eol-style = native
Propchange: ofbiz/branches/executioncontext20091231/framework/context/src/org/ofbiz/context/AccessControllerImpl.java
------------------------------------------------------------------------------
svn:keywords = "Date Rev Author URL Id"
Propchange: ofbiz/branches/executioncontext20091231/framework/context/src/org/ofbiz/context/AccessControllerImpl.java
------------------------------------------------------------------------------
svn:mime-type = text/plain
Added: ofbiz/branches/executioncontext20091231/framework/context/src/org/ofbiz/context/AuthorizationManagerImpl.java
URL: http://svn.apache.org/viewvc/ofbiz/branches/executioncontext20091231/framework/context/src/org/ofbiz/context/AuthorizationManagerImpl.java?rev=894961&view=auto
==============================================================================
--- ofbiz/branches/executioncontext20091231/framework/context/src/org/ofbiz/context/AuthorizationManagerImpl.java (added)
+++ ofbiz/branches/executioncontext20091231/framework/context/src/org/ofbiz/context/AuthorizationManagerImpl.java Fri Jan 1 00:38:52 2010
@@ -0,0 +1,221 @@
+/*******************************************************************************
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ *******************************************************************************/
+package org.ofbiz.context;
+
+import java.security.AccessControlException;
+import java.security.Permission;
+import java.util.List;
+import java.util.Map;
+
+import javolution.util.FastMap;
+
+import org.ofbiz.api.authorization.AccessController;
+import org.ofbiz.api.authorization.BasicPermissions;
+import org.ofbiz.api.authorization.AuthorizationManager;
+import org.ofbiz.api.authorization.NullAuthorizationManager;
+import org.ofbiz.entity.Delegator;
+import org.ofbiz.entity.GenericEntityException;
+import org.ofbiz.entity.GenericValue;
+import org.ofbiz.entity.condition.EntityCondition;
+//import org.ofbiz.base.util.Debug;
+import org.ofbiz.base.util.UtilMisc;
+import org.ofbiz.base.util.cache.UtilCache;
+import org.ofbiz.security.OFBizSecurity;
+import org.ofbiz.service.ThreadContext;
+
+/**
+ * An implementation of the AuthorizationManager interface that uses the OFBiz database
+ * for authorization data storage.
+ */
+public class AuthorizationManagerImpl extends OFBizSecurity implements AuthorizationManager {
+
+ // Right now this class implements permission checking only.
+
+ public static final String module = AuthorizationManagerImpl.class.getName();
+// protected static final UtilCache<String, PathNode> userPermCache = UtilCache.createUtilCache("authorization.UserPermissions");
+ protected static final Map<String, PathNode> userPermCache = FastMap.newInstance();
+ protected static final AuthorizationManager nullAuthorizationManager = new NullAuthorizationManager();
+ protected static boolean underConstruction = false;
+
+ public AuthorizationManagerImpl() {
+ }
+
+ public void assignGroupPermission(String userGroupId, String artifactId, Permission permission) {
+ // TODO Auto-generated method stub
+
+ }
+
+ public void assignGroupToGroup(String childGroupId, String parentGroupId) {
+ // TODO Auto-generated method stub
+
+ }
+
+ public void assignUserPermission(String userLoginId, String artifactId, Permission permission) {
+ // TODO Auto-generated method stub
+
+ }
+
+ public void assignUserToGroup(String userLoginId, String userGroupId) {
+ // TODO Auto-generated method stub
+
+ }
+
+ public void createUser(String userLoginId, String password) {
+ // TODO Auto-generated method stub
+
+ }
+
+ public String createUserGroup(String description) {
+ // TODO Auto-generated method stub
+ return null;
+ }
+
+ public void deleteGroupFromGroup(String childGroupId, String parentGroupId) {
+ // TODO Auto-generated method stub
+
+ }
+
+ public void deleteGroupPermission(String userGroupId, String artifactId, Permission permission) {
+ // TODO Auto-generated method stub
+
+ }
+
+ public void deleteUser(String userLoginId) {
+ // TODO Auto-generated method stub
+
+ }
+
+ public void deleteUserFromGroup(String userLoginId, String userGroupId) {
+ // TODO Auto-generated method stub
+
+ }
+
+ public void deleteUserGroup(String userGroupId) {
+ // TODO Auto-generated method stub
+
+ }
+
+ public void deleteUserPermission(String userLoginId, String artifactId, Permission permission) {
+ // TODO Auto-generated method stub
+
+ }
+
+ public void updateUser(String userLoginId, String password) {
+ // TODO Auto-generated method stub
+
+ }
+
+ public void updateUserGroup(String userGroupId, String description) {
+ // TODO Auto-generated method stub
+
+ }
+
+ @Override
+ public void clearUserData(GenericValue userLogin) {
+ super.clearUserData(userLogin);
+ userPermCache.remove(userLogin.getString("userLogin"));
+ }
+
+ public AccessController getAccessController() throws AccessControlException {
+ String userLoginId = ThreadContext.getUserLogin().getString("userLoginId");
+ PathNode node = getUserPermissionsNode(userLoginId);
+ if (node == null) {
+ // During object construction, artifacts will be used that will ultimately
+ // call this method. In order for object construction to succeed, we need
+ // to allow unrestricted access to all artifacts.
+ return nullAuthorizationManager.getAccessController();
+ }
+ return new AccessControllerImpl(getUserPermissionsNode(userLoginId));
+ }
+
+ protected static PathNode getUserPermissionsNode(String userLoginId) throws AccessControlException {
+ if (underConstruction) {
+ return null;
+ }
+ PathNode node = userPermCache.get(userLoginId);
+ if (node != null) {
+ return node;
+ }
+ synchronized (userPermCache) {
+ underConstruction = true;
+ node = new PathNode();
+ // Set up the ExecutionContext for unrestricted access to security-aware artifacts
+ ThreadContext.runUnprotected();
+ Delegator delegator = ThreadContext.getDelegator();
+ try {
+ // Process group membership permissions first
+ List<GenericValue> groupMemberships = delegator.findList("UserToUserGroupRel", EntityCondition.makeCondition(UtilMisc.toMap("userLoginId", userLoginId)), null, null, null, false);
+ for (GenericValue userGroup : groupMemberships) {
+ processGroupPermissions(userGroup.getString("groupId"), node, delegator);
+ }
+ // Process user permissions last
+ List<GenericValue> permissionValues = delegator.findList("UserToArtifactPermRel", EntityCondition.makeCondition(UtilMisc.toMap("userLoginId", userLoginId)), null, null, null, false);
+ setPermissions(userLoginId, node, permissionValues);
+ userPermCache.put(userLoginId, node);
+ } catch (GenericEntityException e) {
+ throw new AccessControlException(e.getMessage());
+ } finally {
+ ThreadContext.endRunUnprotected();
+ underConstruction = false;
+ }
+ }
+ return node;
+ }
+
+ protected static void processGroupPermissions(String groupId, PathNode node, Delegator delegator) throws AccessControlException {
+ try {
+ // Process this group's memberships first
+ List<GenericValue> parentGroups = delegator.findList("UserGroupRelationship", EntityCondition.makeCondition(UtilMisc.toMap("toGroupId", groupId)), null, null, null, false);
+ for (GenericValue parentGroup : parentGroups) {
+ processGroupPermissions(parentGroup.getString("fromGroupId"), node, delegator);
+ }
+ // Process this group's permissions
+ List<GenericValue> permissionValues = delegator.findList("UserGrpToArtifactPermRel", EntityCondition.makeCondition(UtilMisc.toMap("groupId", groupId)), null, null, null, false);
+ setPermissions(groupId, node, permissionValues);
+ } catch (GenericEntityException e) {
+ throw new AccessControlException(e.getMessage());
+ }
+ }
+
+ protected static void setPermissions(String id, PathNode node, List<GenericValue> permissionValues) {
+ for (GenericValue value : permissionValues) {
+ String artifactPath = value.getString("artifactPath");
+ OFBizPermission target = new OFBizPermission(id + "@" + artifactPath);
+ String[] pair = value.getString("permissionValue").split("=");
+ if ("filter".equalsIgnoreCase(pair[0])) {
+ target.filters.add(pair[1]);
+ } else if ("service".equalsIgnoreCase(pair[0])) {
+ target.services.add(pair[1]);
+ } else {
+ Permission permission = BasicPermissions.ConversionMap.get(pair[0].toUpperCase());
+ if (permission != null) {
+ if ("true".equalsIgnoreCase(pair[1])) {
+ target.includePermissions.getPermissionsSet().add(permission);
+ } else {
+ target.excludePermissions.getPermissionsSet().add(permission);
+ }
+ } else {
+ throw new AccessControlException("Invalid permission: " + pair[0]);
+ }
+ }
+ node.setPermissions(artifactPath, target);
+ }
+ }
+
+}
Propchange: ofbiz/branches/executioncontext20091231/framework/context/src/org/ofbiz/context/AuthorizationManagerImpl.java
------------------------------------------------------------------------------
svn:eol-style = native
Propchange: ofbiz/branches/executioncontext20091231/framework/context/src/org/ofbiz/context/AuthorizationManagerImpl.java
------------------------------------------------------------------------------
svn:keywords = "Date Rev Author URL Id"
Propchange: ofbiz/branches/executioncontext20091231/framework/context/src/org/ofbiz/context/AuthorizationManagerImpl.java
------------------------------------------------------------------------------
svn:mime-type = text/plain
Added: ofbiz/branches/executioncontext20091231/framework/context/src/org/ofbiz/context/ExecutionContextImpl.java
URL: http://svn.apache.org/viewvc/ofbiz/branches/executioncontext20091231/framework/context/src/org/ofbiz/context/ExecutionContextImpl.java?rev=894961&view=auto
==============================================================================
--- ofbiz/branches/executioncontext20091231/framework/context/src/org/ofbiz/context/ExecutionContextImpl.java (added)
+++ ofbiz/branches/executioncontext20091231/framework/context/src/org/ofbiz/context/ExecutionContextImpl.java Fri Jan 1 00:38:52 2010
@@ -0,0 +1,150 @@
+/*******************************************************************************
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ *******************************************************************************/
+package org.ofbiz.context;
+
+import java.util.Locale;
+import java.util.Map;
+import java.util.TimeZone;
+
+import org.ofbiz.api.authorization.AccessController;
+import org.ofbiz.api.authorization.AuthorizationManager;
+import org.ofbiz.base.util.Debug;
+import org.ofbiz.base.util.UtilProperties;
+import org.ofbiz.entity.DelegatorFactory;
+import org.ofbiz.entity.Delegator;
+import org.ofbiz.entity.GenericEntityException;
+import org.ofbiz.entity.GenericValue;
+import org.ofbiz.service.ExecutionContext;
+import org.ofbiz.service.GenericDispatcher;
+import org.ofbiz.service.LocalDispatcher;
+
+/** An implementation of the <code>ExecutionContext</code> interface. */
+public class ExecutionContextImpl extends org.ofbiz.api.context.ExecutionContextImpl implements ExecutionContext {
+
+ public static final String module = ExecutionContextImpl.class.getName();
+ protected Delegator delegator = null;
+ protected LocalDispatcher dispatcher = null;
+ protected AuthorizationManager security = null;
+ protected GenericValue userLogin = null;
+
+ public AccessController getAccessController() {
+ return (AccessController) this.getSecurity().getAccessController();
+ }
+
+ public Delegator getDelegator() {
+ if (this.delegator == null) {
+ this.delegator = DelegatorFactory.getDelegator("default");
+ }
+ return this.delegator;
+ }
+
+ public LocalDispatcher getDispatcher() {
+ if (this.dispatcher == null) {
+ this.dispatcher = GenericDispatcher.getLocalDispatcher("ExecutionContext", this.getDelegator());
+ }
+ return this.dispatcher;
+ }
+
+ public AuthorizationManager getSecurity() {
+ if (this.security == null) {
+ ClassLoader loader = Thread.currentThread().getContextClassLoader();
+ String className = UtilProperties.getPropertyValue("api.properties", "authorizationManager.class");
+ try {
+ this.security = (AuthorizationManager) loader.loadClass(className).newInstance();
+ } catch (Exception e) {
+ Debug.logError(e, module);
+ }
+ }
+ return this.security;
+ }
+
+ public GenericValue getUserLogin() {
+ if (this.userLogin == null) {
+ Delegator localDelegator = this.getDelegator();
+ try {
+ this.userLogin = localDelegator.findOne("UserLogin", false, "userLoginId", "NOT_LOGGED_IN");
+ } catch (GenericEntityException e) {
+ Debug.logError(e, "Error while getting NOT_LOGGED_IN user: ", module);
+ }
+ if (this.userLogin == null) {
+ this.userLogin = localDelegator.makeValue("UserLogin");
+ this.userLogin.set("userLoginId", "NOT_LOGGED_IN");
+ }
+ }
+ return this.userLogin;
+ }
+
+ public void initializeContext(Map<String, ? extends Object> params) {
+ this.setDelegator((Delegator) params.get("delegator"));
+ this.setDispatcher((LocalDispatcher) params.get("dispatcher"));
+ this.setSecurity((AuthorizationManager) params.get("security"));
+ this.setUserLogin((GenericValue) params.get("userLogin"));
+ this.setLocale((Locale) params.get("locale"));
+ this.setTimeZone((TimeZone) params.get("timeZone"));
+ }
+
+ @Override
+ public void reset() {
+ super.reset();
+ this.delegator = null;
+ this.dispatcher = null;
+ this.security = null;
+ this.userLogin = null;
+ }
+
+ protected void resetUserPreferences() {
+ if (this.userLogin != null) {
+ this.setLocale(userLogin.getString("lastLocale"));
+ this.setLocale(userLogin.getString("lastTimeZone"));
+ } else {
+ this.locale = Locale.getDefault();
+ this.timeZone = TimeZone.getDefault();
+ }
+ }
+
+ public void setDelegator(Delegator delegator) {
+ if (delegator != null) {
+ this.delegator = delegator;
+ }
+ }
+
+ public void setDispatcher(LocalDispatcher dispatcher) {
+ if (dispatcher != null) {
+ this.dispatcher = dispatcher;
+ }
+ }
+
+ public void setSecurity(AuthorizationManager security) {
+ if (security != null) {
+ this.security = security;
+ }
+ }
+
+ public void setUserLogin(GenericValue userLogin) {
+ if (userLogin != null) {
+ this.userLogin = userLogin;
+ this.resetUserPreferences();
+ }
+ }
+
+ public void clearUserData() {
+ this.userLogin = null;
+ this.resetUserPreferences();
+ }
+}
Propchange: ofbiz/branches/executioncontext20091231/framework/context/src/org/ofbiz/context/ExecutionContextImpl.java
------------------------------------------------------------------------------
svn:eol-style = native
Propchange: ofbiz/branches/executioncontext20091231/framework/context/src/org/ofbiz/context/ExecutionContextImpl.java
------------------------------------------------------------------------------
svn:keywords = "Date Rev Author URL Id"
Propchange: ofbiz/branches/executioncontext20091231/framework/context/src/org/ofbiz/context/ExecutionContextImpl.java
------------------------------------------------------------------------------
svn:mime-type = text/plain
Added: ofbiz/branches/executioncontext20091231/framework/context/src/org/ofbiz/context/OFBizPermission.java
URL: http://svn.apache.org/viewvc/ofbiz/branches/executioncontext20091231/framework/context/src/org/ofbiz/context/OFBizPermission.java?rev=894961&view=auto
==============================================================================
--- ofbiz/branches/executioncontext20091231/framework/context/src/org/ofbiz/context/OFBizPermission.java (added)
+++ ofbiz/branches/executioncontext20091231/framework/context/src/org/ofbiz/context/OFBizPermission.java Fri Jan 1 00:38:52 2010
@@ -0,0 +1,140 @@
+/*******************************************************************************
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ *******************************************************************************/
+package org.ofbiz.context;
+
+import static org.ofbiz.api.authorization.BasicPermissions.*;
+
+import java.security.Permission;
+import java.util.Set;
+
+import javolution.util.FastSet;
+
+import org.ofbiz.api.authorization.PermissionsUnion;
+
+/** OFBizPermission class.
+ * <p>This class enforces the security-aware artifact permission
+ * checking rules:<br>
+ * <ul>
+ * <li>If the permissions list contains the specified permission,
+ * then access is granted</li>
+ * <li>If services are specified, and all services return
+ * <code>hasPermission=true</code>, then access is granted</li>
+ * <li>The class contains a list of filters that can be used
+ * by filter implementations</li>
+ * </ul></p>
+ *
+ */
+@SuppressWarnings("serial")
+public class OFBizPermission extends Permission {
+
+ protected Permission adminPermission = null;
+ protected final PermissionsUnion includePermissions;
+ protected final PermissionsUnion excludePermissions;
+ protected final Set<String> filters = FastSet.newInstance();
+ protected final Set<String> services = FastSet.newInstance();
+
+ public OFBizPermission(String name) {
+ super(name);
+ this.includePermissions = new PermissionsUnion(name);
+ this.excludePermissions = new PermissionsUnion(name);
+ }
+
+ @Override
+ public boolean equals(Object obj) {
+ if (obj == this) {
+ return true;
+ }
+ try {
+ OFBizPermission that = (OFBizPermission) obj;
+ return this.getName().equals(that.getName());
+ } catch (Exception e) {}
+ return false;
+ }
+
+ @Override
+ public String getActions() {
+ return null;
+ }
+
+ @Override
+ public int hashCode() {
+ return this.getName().hashCode();
+ }
+
+ @Override
+ public boolean implies(Permission permission) {
+ if (this.adminPermission != null) {
+ return this.adminPermission.implies(permission);
+ }
+ return this.includePermissions.implies(permission) && !this.excludePermissions.implies(permission);
+ }
+
+ public Set<String> getFilterNames() {
+ return this.filters;
+ }
+
+ public Set<String> getServiceNames() {
+ return this.services;
+ }
+
+ public void accumulatePermissions(OFBizPermission permission) {
+ if (permission == null || this.adminPermission != null) {
+ return;
+ }
+ if (permission.includePermissions.getPermissionsSet().contains(Admin)) {
+ this.adminPermission = Admin;
+ return;
+ }
+ this.includePermissions.getPermissionsSet().removeAll(permission.excludePermissions.getPermissionsSet());
+ this.excludePermissions.getPermissionsSet().removeAll(permission.includePermissions.getPermissionsSet());
+ this.includePermissions.getPermissionsSet().addAll(permission.includePermissions.getPermissionsSet());
+ this.excludePermissions.getPermissionsSet().addAll(permission.excludePermissions.getPermissionsSet());
+ this.filters.addAll(permission.filters);
+ this.services.addAll(permission.services);
+ }
+
+ public void reset() {
+ this.adminPermission = null;
+ this.includePermissions.getPermissionsSet().clear();
+ this.excludePermissions.getPermissionsSet().clear();
+ this.filters.clear();
+ this.services.clear();
+ }
+
+ @Override
+ public String toString() {
+ if (this.adminPermission != null) {
+ return this.adminPermission.toString();
+ }
+ StringBuilder sb = new StringBuilder();
+ sb.append(this.includePermissions);
+ sb.append(" ");
+ sb.append(this.excludePermissions);
+ for (String filter : this.filters) {
+ sb.append(" filter=");
+ sb.append(filter);
+ }
+ for (String service : this.services) {
+ sb.append(" service=");
+ sb.append(service);
+ }
+ return sb.toString().trim();
+ }
+
+}
Propchange: ofbiz/branches/executioncontext20091231/framework/context/src/org/ofbiz/context/OFBizPermission.java
------------------------------------------------------------------------------
svn:eol-style = native
Propchange: ofbiz/branches/executioncontext20091231/framework/context/src/org/ofbiz/context/OFBizPermission.java
------------------------------------------------------------------------------
svn:keywords = "Date Rev Author URL Id"
Propchange: ofbiz/branches/executioncontext20091231/framework/context/src/org/ofbiz/context/OFBizPermission.java
------------------------------------------------------------------------------
svn:mime-type = text/plain
Added: ofbiz/branches/executioncontext20091231/framework/context/src/org/ofbiz/context/PathNode.java
URL: http://svn.apache.org/viewvc/ofbiz/branches/executioncontext20091231/framework/context/src/org/ofbiz/context/PathNode.java?rev=894961&view=auto
==============================================================================
--- ofbiz/branches/executioncontext20091231/framework/context/src/org/ofbiz/context/PathNode.java (added)
+++ ofbiz/branches/executioncontext20091231/framework/context/src/org/ofbiz/context/PathNode.java Fri Jan 1 00:38:52 2010
@@ -0,0 +1,121 @@
+/*******************************************************************************
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ *******************************************************************************/
+package org.ofbiz.context;
+
+import java.util.Collection;
+import java.util.Map;
+
+import javolution.util.FastList;
+import javolution.util.FastMap;
+
+/** Implements a node in a permissions tree.
+ */
+public class PathNode {
+
+ protected String nodeName = null;
+ protected OFBizPermission permission = null;
+ protected Map<String, PathNode> childNodes = null;
+
+ public PathNode() {}
+
+ protected PathNode(String nodeName) {
+ this.nodeName = nodeName;
+ }
+
+ public void setPermissions(String artifactPath, OFBizPermission permission) {
+ int pos = artifactPath.indexOf("/");
+ if (pos == -1) {
+ if (this.permission == null) {
+ this.permission = permission;
+ } else {
+ this.permission.accumulatePermissions(permission);
+ }
+ if (this.nodeName == null) {
+ this.nodeName = artifactPath;
+ }
+ return;
+ }
+ String thisNodeName = artifactPath.substring(0, pos);
+ if (this.nodeName == null) {
+ this.nodeName = thisNodeName;
+ }
+ artifactPath = artifactPath.substring(pos + 1);
+ String nextNodeName = artifactPath;
+ pos = artifactPath.indexOf("/");
+ if (pos != -1) {
+ nextNodeName = artifactPath.substring(0, pos);
+ }
+ String key = nextNodeName.toUpperCase();
+ if (this.childNodes == null) {
+ this.childNodes = FastMap.newInstance();
+ }
+ PathNode node = this.childNodes.get(key);
+ if (node == null) {
+ node = new PathNode(nextNodeName);
+ this.childNodes.put(key, node);
+ }
+ node.setPermissions(artifactPath, permission);
+ }
+
+ public void getPermissions(String artifactPath, OFBizPermission permission) {
+ permission.accumulatePermissions(this.permission);
+ int pos = artifactPath.indexOf("/");
+ if (pos != -1 && this.childNodes != null) {
+ artifactPath = artifactPath.substring(pos + 1);
+ String nextNodeName = artifactPath;
+ pos = artifactPath.indexOf("/");
+ if (pos != -1) {
+ nextNodeName = artifactPath.substring(0, pos);
+ }
+ PathNode node = this.childNodes.get(nextNodeName.toUpperCase());
+ if (node != null) {
+ node.getPermissions(artifactPath, permission);
+ }
+ }
+ }
+
+ @Override
+ public String toString() {
+ FastList<PathNode> currentPath = FastList.newInstance();
+ StringBuilder result = new StringBuilder();
+ buildNodeString(currentPath, result);
+ return result.toString();
+ }
+
+ protected void buildNodeString(FastList<PathNode> currentPath, StringBuilder result) {
+ currentPath.add(this);
+ if (this.permission != null) {
+ for (PathNode pathNode: currentPath) {
+ result.append("/");
+ result.append(pathNode.nodeName);
+ }
+ result.append("[");
+ result.append(this.permission);
+ result.append("]");
+ result.append("\n");
+ }
+ if (this.childNodes != null) {
+ Collection<PathNode> childNodes = this.childNodes.values();
+ for (PathNode childNode : childNodes) {
+ childNode.buildNodeString(currentPath, result);
+ }
+ }
+ currentPath.removeLast();
+ }
+}
Propchange: ofbiz/branches/executioncontext20091231/framework/context/src/org/ofbiz/context/PathNode.java
------------------------------------------------------------------------------
svn:eol-style = native
Propchange: ofbiz/branches/executioncontext20091231/framework/context/src/org/ofbiz/context/PathNode.java
------------------------------------------------------------------------------
svn:keywords = "Date Rev Author URL Id"
Propchange: ofbiz/branches/executioncontext20091231/framework/context/src/org/ofbiz/context/PathNode.java
------------------------------------------------------------------------------
svn:mime-type = text/plain
Added: ofbiz/branches/executioncontext20091231/framework/context/src/org/ofbiz/context/SecurityAwareEli.java
URL: http://svn.apache.org/viewvc/ofbiz/branches/executioncontext20091231/framework/context/src/org/ofbiz/context/SecurityAwareEli.java?rev=894961&view=auto
==============================================================================
--- ofbiz/branches/executioncontext20091231/framework/context/src/org/ofbiz/context/SecurityAwareEli.java (added)
+++ ofbiz/branches/executioncontext20091231/framework/context/src/org/ofbiz/context/SecurityAwareEli.java Fri Jan 1 00:38:52 2010
@@ -0,0 +1,147 @@
+/*******************************************************************************
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ *******************************************************************************/
+package org.ofbiz.context;
+
+import java.util.List;
+import java.util.Set;
+
+import javolution.util.FastList;
+
+import org.ofbiz.entity.GenericDelegator;
+import org.ofbiz.entity.GenericEntityException;
+import org.ofbiz.entity.GenericValue;
+import org.ofbiz.entity.util.EntityListIterator;
+
+/**
+ * SecurityAwareEli class. This class decorates an <code>
+ * EntityListIterator</code> instance and filters a list of
+ * <code>GenericValue</code>s based on a set of permission services.
+ * <p>The permission service must implement <code>permissionInterface</code>
+ * and accept an optional <code>candidateObject</code> parameter (parameter
+ * type is <code>java.lang.Object</code>). The service should
+ * return <code>hasPermission = true</code> if the user is granted access
+ * to the <code>candidateObject</code>.</p>
+ */
+public class SecurityAwareEli extends SecurityAwareListIterator<GenericValue> {
+
+ public static final String module = SecurityAwareEli.class.getName();
+ protected final EntityListIterator listIterator;
+ protected GenericValue previousValue = null;
+
+ public SecurityAwareEli(EntityListIterator iterator, Set<String> serviceNameList) {
+ super(iterator, serviceNameList);
+ this.listIterator = iterator;
+ }
+
+ public boolean absolute(int rowNum) throws GenericEntityException {
+ return this.listIterator.absolute(rowNum);
+ }
+
+ public void afterLast() throws GenericEntityException {
+ this.listIterator.afterLast();
+ }
+
+ public void beforeFirst() throws GenericEntityException {
+ this.listIterator.beforeFirst();
+ }
+
+ public void close() throws GenericEntityException {
+ this.listIterator.close();
+ }
+
+ public GenericValue currentGenericValue() throws GenericEntityException {
+ GenericValue value = this.listIterator.currentGenericValue();
+ while (value != null && !this.hasPermission(value)) {
+ value = this.next();
+ }
+ return value;
+ }
+
+ public int currentIndex() throws GenericEntityException {
+ return this.listIterator.currentIndex();
+ }
+
+ public boolean first() throws GenericEntityException {
+ return this.listIterator.first();
+ }
+
+ public List<GenericValue> getCompleteList() throws GenericEntityException {
+ List<GenericValue> list = FastList.newInstance();
+ GenericValue nextValue = this.next();
+ while (nextValue != null) {
+ list.add(nextValue);
+ nextValue = this.next();
+ }
+ return list;
+ }
+
+ public List<GenericValue> getPartialList(int start, int number) throws GenericEntityException {
+ List<GenericValue> list = FastList.newInstance();
+ if (number == 0) {
+ return list;
+ }
+ if (start == 0) {
+ start = 1;
+ }
+ GenericValue nextValue = null;
+ if (start == 1) {
+ nextValue = this.next();
+ if (nextValue == null) {
+ return list;
+ }
+ } else {
+ nextValue = this.getAbsolute(start);
+ }
+ int numRetreived = 1;
+ while (number > numRetreived && nextValue != null) {
+ list.add(nextValue);
+ numRetreived++;
+ nextValue = this.next();
+ }
+ return list;
+ }
+
+ protected GenericValue getAbsolute(int start) throws GenericEntityException {
+ if (!this.absolute(start)) {
+ return null;
+ }
+ return this.currentGenericValue();
+ }
+
+ public int getResultsSizeAfterPartialList() throws GenericEntityException {
+ return this.listIterator.getResultsSizeAfterPartialList();
+ }
+
+ public boolean last() throws GenericEntityException {
+ return this.listIterator.last();
+ }
+
+ public boolean relative(int rows) throws GenericEntityException {
+ return this.listIterator.relative(rows);
+ }
+
+ public void setDelegator(GenericDelegator delegator) {
+ this.listIterator.setDelegator(delegator);
+ }
+
+ public void setFetchSize(int rows) throws GenericEntityException {
+ this.listIterator.setFetchSize(rows);
+ }
+
+}
Propchange: ofbiz/branches/executioncontext20091231/framework/context/src/org/ofbiz/context/SecurityAwareEli.java
------------------------------------------------------------------------------
svn:eol-style = native
Propchange: ofbiz/branches/executioncontext20091231/framework/context/src/org/ofbiz/context/SecurityAwareEli.java
------------------------------------------------------------------------------
svn:keywords = "Date Rev Author URL Id"
Propchange: ofbiz/branches/executioncontext20091231/framework/context/src/org/ofbiz/context/SecurityAwareEli.java
------------------------------------------------------------------------------
svn:mime-type = text/plain