* Updates to repositories and proxy connector configuration / admin screens.
git-svn-id: https://svn.apache.org/repos/asf/maven/archiva/trunk@535418 13f79535-47bb-0310-9956-ffa450edef68
|
@ -0,0 +1,55 @@
|
||||||
|
package org.apache.maven.archiva.configuration.util;
|
||||||
|
|
||||||
|
/*
|
||||||
|
* 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.
|
||||||
|
*/
|
||||||
|
|
||||||
|
import org.apache.commons.collections.Predicate;
|
||||||
|
import org.apache.maven.archiva.configuration.RepositoryConfiguration;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Predicate for {@link RepositoryConfiguration} objects that are local (aka managed)
|
||||||
|
* {@link RepositoryConfiguration#isManaged()}
|
||||||
|
*
|
||||||
|
* @author <a href="mailto:joakim@erdfelt.com">Joakim Erdfelt</a>
|
||||||
|
* @version $Id$
|
||||||
|
*/
|
||||||
|
public class LocalRepositoryPredicate
|
||||||
|
implements Predicate
|
||||||
|
{
|
||||||
|
public static final Predicate INSTANCE = new LocalRepositoryPredicate();
|
||||||
|
|
||||||
|
public static Predicate getInstance()
|
||||||
|
{
|
||||||
|
return INSTANCE;
|
||||||
|
}
|
||||||
|
|
||||||
|
public boolean evaluate( Object object )
|
||||||
|
{
|
||||||
|
boolean satisfies = false;
|
||||||
|
|
||||||
|
if ( object instanceof RepositoryConfiguration )
|
||||||
|
{
|
||||||
|
RepositoryConfiguration repoconfig = (RepositoryConfiguration) object;
|
||||||
|
return repoconfig.isManaged();
|
||||||
|
}
|
||||||
|
|
||||||
|
return satisfies;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
|
@ -0,0 +1,59 @@
|
||||||
|
package org.apache.maven.archiva.configuration.util;
|
||||||
|
|
||||||
|
/*
|
||||||
|
* 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.
|
||||||
|
*/
|
||||||
|
|
||||||
|
import org.apache.commons.collections.Predicate;
|
||||||
|
import org.apache.commons.lang.StringUtils;
|
||||||
|
import org.apache.maven.archiva.configuration.ProxyConnectorConfiguration;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* ProxyConnectorPredicate
|
||||||
|
*
|
||||||
|
* @author <a href="mailto:joakim@erdfelt.com">Joakim Erdfelt</a>
|
||||||
|
* @version $Id$
|
||||||
|
*/
|
||||||
|
public class ProxyConnectorSelectionPredicate
|
||||||
|
implements Predicate
|
||||||
|
{
|
||||||
|
private String sourceId;
|
||||||
|
|
||||||
|
private String targetId;
|
||||||
|
|
||||||
|
public ProxyConnectorSelectionPredicate( String sourceId, String targetId )
|
||||||
|
{
|
||||||
|
this.sourceId = sourceId;
|
||||||
|
this.targetId = targetId;
|
||||||
|
}
|
||||||
|
|
||||||
|
public boolean evaluate( Object object )
|
||||||
|
{
|
||||||
|
boolean satisfies = false;
|
||||||
|
|
||||||
|
if ( object instanceof ProxyConnectorConfiguration )
|
||||||
|
{
|
||||||
|
ProxyConnectorConfiguration connector = (ProxyConnectorConfiguration) object;
|
||||||
|
return ( StringUtils.equals( sourceId, connector.getSourceRepoId() ) && StringUtils
|
||||||
|
.equals( targetId, connector.getTargetRepoId() ) );
|
||||||
|
}
|
||||||
|
|
||||||
|
return satisfies;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
|
@ -0,0 +1,54 @@
|
||||||
|
package org.apache.maven.archiva.configuration.util;
|
||||||
|
|
||||||
|
/*
|
||||||
|
* 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.
|
||||||
|
*/
|
||||||
|
|
||||||
|
import org.apache.commons.collections.Predicate;
|
||||||
|
import org.apache.maven.archiva.configuration.RepositoryConfiguration;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Predicate for {@link RepositoryConfiguration} objects that are remote
|
||||||
|
* {@link RepositoryConfiguration#isRemote()}
|
||||||
|
*
|
||||||
|
* @author <a href="mailto:joakim@erdfelt.com">Joakim Erdfelt</a>
|
||||||
|
* @version $Id$
|
||||||
|
*/
|
||||||
|
public class RemoteRepositoryPredicate
|
||||||
|
implements Predicate
|
||||||
|
{
|
||||||
|
public static final Predicate INSTANCE = new RemoteRepositoryPredicate();
|
||||||
|
|
||||||
|
public static Predicate getInstance()
|
||||||
|
{
|
||||||
|
return INSTANCE;
|
||||||
|
}
|
||||||
|
|
||||||
|
public boolean evaluate( Object object )
|
||||||
|
{
|
||||||
|
boolean satisfies = false;
|
||||||
|
|
||||||
|
if ( object instanceof RepositoryConfiguration )
|
||||||
|
{
|
||||||
|
RepositoryConfiguration repoconfig = (RepositoryConfiguration) object;
|
||||||
|
return repoconfig.isRemote();
|
||||||
|
}
|
||||||
|
|
||||||
|
return satisfies;
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,63 @@
|
||||||
|
package org.apache.maven.archiva.configuration.util;
|
||||||
|
|
||||||
|
/*
|
||||||
|
* 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.
|
||||||
|
*/
|
||||||
|
|
||||||
|
import org.apache.maven.archiva.configuration.RepositoryConfiguration;
|
||||||
|
|
||||||
|
import java.util.Comparator;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* RepositoryConfigurationComparator
|
||||||
|
*
|
||||||
|
* @author <a href="mailto:joakim@erdfelt.com">Joakim Erdfelt</a>
|
||||||
|
* @version $Id$
|
||||||
|
*/
|
||||||
|
public class RepositoryConfigurationComparator
|
||||||
|
implements Comparator
|
||||||
|
{
|
||||||
|
|
||||||
|
public int compare( Object o1, Object o2 )
|
||||||
|
{
|
||||||
|
if ( o1 == null && o2 == null )
|
||||||
|
{
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
if ( o1 == null && o2 != null )
|
||||||
|
{
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
if ( o1 != null && o2 == null )
|
||||||
|
{
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
if ( ( o1 instanceof RepositoryConfiguration ) && ( o2 instanceof RepositoryConfiguration ) )
|
||||||
|
{
|
||||||
|
String id1 = ( (RepositoryConfiguration) o1 ).getId();
|
||||||
|
String id2 = ( (RepositoryConfiguration) o2 ).getId();
|
||||||
|
return id1.compareToIgnoreCase( id2 );
|
||||||
|
}
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
|
@ -0,0 +1,56 @@
|
||||||
|
package org.apache.maven.archiva.configuration.util;
|
||||||
|
|
||||||
|
/*
|
||||||
|
* 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.
|
||||||
|
*/
|
||||||
|
|
||||||
|
import org.apache.commons.collections.Closure;
|
||||||
|
import org.apache.maven.archiva.configuration.RepositoryConfiguration;
|
||||||
|
|
||||||
|
import java.util.List;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* RepositoryIdListClosure
|
||||||
|
*
|
||||||
|
* @author <a href="mailto:joakim@erdfelt.com">Joakim Erdfelt</a>
|
||||||
|
* @version $Id$
|
||||||
|
*/
|
||||||
|
public class RepositoryIdListClosure
|
||||||
|
implements Closure
|
||||||
|
{
|
||||||
|
private List list;
|
||||||
|
|
||||||
|
public RepositoryIdListClosure( List list )
|
||||||
|
{
|
||||||
|
this.list = list;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void execute( Object input )
|
||||||
|
{
|
||||||
|
if ( input instanceof RepositoryConfiguration )
|
||||||
|
{
|
||||||
|
RepositoryConfiguration repoconfig = (RepositoryConfiguration) input;
|
||||||
|
list.add( repoconfig.getId() );
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public List getList()
|
||||||
|
{
|
||||||
|
return list;
|
||||||
|
}
|
||||||
|
}
|
|
@ -365,7 +365,7 @@
|
||||||
<field>
|
<field>
|
||||||
<name>policies</name>
|
<name>policies</name>
|
||||||
<version>1.0.0+</version>
|
<version>1.0.0+</version>
|
||||||
<type>Properties</type>
|
<type>Map</type>
|
||||||
<description>Policy configuration for the connector.</description>
|
<description>Policy configuration for the connector.</description>
|
||||||
<association xml.mapStyle="inline">
|
<association xml.mapStyle="inline">
|
||||||
<type>String</type>
|
<type>String</type>
|
||||||
|
@ -375,7 +375,7 @@
|
||||||
<field>
|
<field>
|
||||||
<name>properties</name>
|
<name>properties</name>
|
||||||
<version>1.0.0+</version>
|
<version>1.0.0+</version>
|
||||||
<type>Properties</type>
|
<type>Map</type>
|
||||||
<description>Configuration for the connector.</description>
|
<description>Configuration for the connector.</description>
|
||||||
<association xml.mapStyle="inline">
|
<association xml.mapStyle="inline">
|
||||||
<type>String</type>
|
<type>String</type>
|
||||||
|
@ -401,7 +401,14 @@
|
||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
|
|
||||||
return this.getPolicies().getProperty( policyId, defaultValue );
|
Object value = this.getPolicies().get( policyId );
|
||||||
|
|
||||||
|
if ( value == null )
|
||||||
|
{
|
||||||
|
return defaultValue;
|
||||||
|
}
|
||||||
|
|
||||||
|
return (String) value;
|
||||||
}
|
}
|
||||||
]]></code>
|
]]></code>
|
||||||
</codeSegment>
|
</codeSegment>
|
||||||
|
|
|
@ -24,10 +24,10 @@ import org.apache.maven.archiva.common.utils.VersionUtil;
|
||||||
import org.codehaus.plexus.logging.AbstractLogEnabled;
|
import org.codehaus.plexus.logging.AbstractLogEnabled;
|
||||||
|
|
||||||
import java.io.File;
|
import java.io.File;
|
||||||
|
import java.util.ArrayList;
|
||||||
import java.util.Calendar;
|
import java.util.Calendar;
|
||||||
import java.util.HashSet;
|
import java.util.List;
|
||||||
import java.util.Properties;
|
import java.util.Properties;
|
||||||
import java.util.Set;
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* AbstractUpdatePolicy
|
* AbstractUpdatePolicy
|
||||||
|
@ -76,21 +76,26 @@ public abstract class AbstractUpdatePolicy
|
||||||
*/
|
*/
|
||||||
public static final String ONCE = "once";
|
public static final String ONCE = "once";
|
||||||
|
|
||||||
private Set validPolicyCodes = new HashSet();
|
private List options = new ArrayList();
|
||||||
|
|
||||||
public AbstractUpdatePolicy()
|
public AbstractUpdatePolicy()
|
||||||
{
|
{
|
||||||
validPolicyCodes.add( IGNORED );
|
options.add( IGNORED );
|
||||||
validPolicyCodes.add( DISABLED );
|
options.add( DISABLED );
|
||||||
validPolicyCodes.add( DAILY );
|
options.add( DAILY );
|
||||||
validPolicyCodes.add( HOURLY );
|
options.add( HOURLY );
|
||||||
validPolicyCodes.add( ONCE );
|
options.add( ONCE );
|
||||||
}
|
}
|
||||||
|
|
||||||
protected abstract boolean isSnapshotPolicy();
|
protected abstract boolean isSnapshotPolicy();
|
||||||
|
|
||||||
protected abstract String getUpdateMode();
|
protected abstract String getUpdateMode();
|
||||||
|
|
||||||
|
public List getOptions()
|
||||||
|
{
|
||||||
|
return options;
|
||||||
|
}
|
||||||
|
|
||||||
public boolean applyPolicy( String policySetting, Properties request, File localFile )
|
public boolean applyPolicy( String policySetting, Properties request, File localFile )
|
||||||
{
|
{
|
||||||
String version = request.getProperty( "version", "" );
|
String version = request.getProperty( "version", "" );
|
||||||
|
@ -101,7 +106,7 @@ public abstract class AbstractUpdatePolicy
|
||||||
isSnapshotVersion = VersionUtil.isSnapshot( version );
|
isSnapshotVersion = VersionUtil.isSnapshot( version );
|
||||||
}
|
}
|
||||||
|
|
||||||
if ( !validPolicyCodes.contains( policySetting ) )
|
if ( !options.contains( policySetting ) )
|
||||||
{
|
{
|
||||||
// No valid code? false it is then.
|
// No valid code? false it is then.
|
||||||
getLogger().error( "Unknown artifact-update policyCode [" + policySetting + "]" );
|
getLogger().error( "Unknown artifact-update policyCode [" + policySetting + "]" );
|
||||||
|
|
|
@ -24,9 +24,9 @@ import org.apache.maven.archiva.policies.urlcache.UrlFailureCache;
|
||||||
import org.codehaus.plexus.logging.AbstractLogEnabled;
|
import org.codehaus.plexus.logging.AbstractLogEnabled;
|
||||||
|
|
||||||
import java.io.File;
|
import java.io.File;
|
||||||
import java.util.HashSet;
|
import java.util.ArrayList;
|
||||||
|
import java.util.List;
|
||||||
import java.util.Properties;
|
import java.util.Properties;
|
||||||
import java.util.Set;
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* {@link PreDownloadPolicy} to check if the requested url has failed before.
|
* {@link PreDownloadPolicy} to check if the requested url has failed before.
|
||||||
|
@ -53,17 +53,17 @@ public class CachedFailuresPolicy
|
||||||
*/
|
*/
|
||||||
private UrlFailureCache urlFailureCache;
|
private UrlFailureCache urlFailureCache;
|
||||||
|
|
||||||
private Set validPolicyCodes = new HashSet();
|
private List options = new ArrayList();
|
||||||
|
|
||||||
public CachedFailuresPolicy()
|
public CachedFailuresPolicy()
|
||||||
{
|
{
|
||||||
validPolicyCodes.add( IGNORED );
|
options.add( IGNORED );
|
||||||
validPolicyCodes.add( CACHED );
|
options.add( CACHED );
|
||||||
}
|
}
|
||||||
|
|
||||||
public boolean applyPolicy( String policySetting, Properties request, File localFile )
|
public boolean applyPolicy( String policySetting, Properties request, File localFile )
|
||||||
{
|
{
|
||||||
if ( !validPolicyCodes.contains( policySetting ) )
|
if ( !options.contains( policySetting ) )
|
||||||
{
|
{
|
||||||
// No valid code? false it is then.
|
// No valid code? false it is then.
|
||||||
getLogger().error( "Unknown checksum policyCode [" + policySetting + "]" );
|
getLogger().error( "Unknown checksum policyCode [" + policySetting + "]" );
|
||||||
|
@ -93,8 +93,18 @@ public class CachedFailuresPolicy
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
public String getDefaultPolicySetting()
|
public String getDefaultOption()
|
||||||
{
|
{
|
||||||
return IGNORED;
|
return IGNORED;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public String getId()
|
||||||
|
{
|
||||||
|
return "cache-failures";
|
||||||
|
}
|
||||||
|
|
||||||
|
public List getOptions()
|
||||||
|
{
|
||||||
|
return options;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -27,9 +27,9 @@ import org.codehaus.plexus.logging.AbstractLogEnabled;
|
||||||
import java.io.File;
|
import java.io.File;
|
||||||
import java.io.FileNotFoundException;
|
import java.io.FileNotFoundException;
|
||||||
import java.io.IOException;
|
import java.io.IOException;
|
||||||
import java.util.HashSet;
|
import java.util.ArrayList;
|
||||||
|
import java.util.List;
|
||||||
import java.util.Properties;
|
import java.util.Properties;
|
||||||
import java.util.Set;
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* ChecksumPolicy
|
* ChecksumPolicy
|
||||||
|
@ -73,18 +73,18 @@ public class ChecksumPolicy
|
||||||
*/
|
*/
|
||||||
private ChecksumFile checksumFile;
|
private ChecksumFile checksumFile;
|
||||||
|
|
||||||
private Set validPolicyCodes = new HashSet();
|
private List options = new ArrayList();
|
||||||
|
|
||||||
public ChecksumPolicy()
|
public ChecksumPolicy()
|
||||||
{
|
{
|
||||||
validPolicyCodes.add( FAIL );
|
options.add( FAIL );
|
||||||
validPolicyCodes.add( FIX );
|
options.add( FIX );
|
||||||
validPolicyCodes.add( IGNORED );
|
options.add( IGNORED );
|
||||||
}
|
}
|
||||||
|
|
||||||
public boolean applyPolicy( String policySetting, Properties request, File localFile )
|
public boolean applyPolicy( String policySetting, Properties request, File localFile )
|
||||||
{
|
{
|
||||||
if ( !validPolicyCodes.contains( policySetting ) )
|
if ( !options.contains( policySetting ) )
|
||||||
{
|
{
|
||||||
// No valid code? false it is then.
|
// No valid code? false it is then.
|
||||||
getLogger().error( "Unknown checksum policyCode [" + policySetting + "]" );
|
getLogger().error( "Unknown checksum policyCode [" + policySetting + "]" );
|
||||||
|
@ -275,9 +275,19 @@ public class ChecksumPolicy
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public String getDefaultPolicySetting()
|
public String getDefaultOption()
|
||||||
{
|
{
|
||||||
return FIX;
|
return FIX;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public String getId()
|
||||||
|
{
|
||||||
|
return "checksum";
|
||||||
|
}
|
||||||
|
|
||||||
|
public List getOptions()
|
||||||
|
{
|
||||||
|
return options;
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -20,6 +20,7 @@ package org.apache.maven.archiva.policies;
|
||||||
*/
|
*/
|
||||||
|
|
||||||
import java.io.File;
|
import java.io.File;
|
||||||
|
import java.util.List;
|
||||||
import java.util.Properties;
|
import java.util.Properties;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -39,11 +40,25 @@ public interface DownloadPolicy
|
||||||
public static final boolean FAIL = false;
|
public static final boolean FAIL = false;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Get the default policy setting.
|
* Get the list of options for this policy.
|
||||||
*
|
*
|
||||||
* @return the default policy setting.
|
* @return the list of options for this policy.
|
||||||
*/
|
*/
|
||||||
public String getDefaultPolicySetting();
|
public List getOptions();
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Get the default option for this policy.
|
||||||
|
*
|
||||||
|
* @return the default policy for this policy.
|
||||||
|
*/
|
||||||
|
public String getDefaultOption();
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Get the id for this policy.
|
||||||
|
*
|
||||||
|
* @return the id for this policy.
|
||||||
|
*/
|
||||||
|
public String getId();
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Apply the download policy.
|
* Apply the download policy.
|
||||||
|
|
|
@ -33,7 +33,7 @@ public class ReleasesPolicy
|
||||||
extends AbstractUpdatePolicy
|
extends AbstractUpdatePolicy
|
||||||
implements PreDownloadPolicy
|
implements PreDownloadPolicy
|
||||||
{
|
{
|
||||||
public String getDefaultPolicySetting()
|
public String getDefaultOption()
|
||||||
{
|
{
|
||||||
return AbstractUpdatePolicy.IGNORED;
|
return AbstractUpdatePolicy.IGNORED;
|
||||||
}
|
}
|
||||||
|
@ -47,4 +47,9 @@ public class ReleasesPolicy
|
||||||
{
|
{
|
||||||
return "releases";
|
return "releases";
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public String getId()
|
||||||
|
{
|
||||||
|
return "releases";
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -33,7 +33,7 @@ public class SnapshotsPolicy
|
||||||
extends AbstractUpdatePolicy
|
extends AbstractUpdatePolicy
|
||||||
implements PreDownloadPolicy
|
implements PreDownloadPolicy
|
||||||
{
|
{
|
||||||
public String getDefaultPolicySetting()
|
public String getDefaultOption()
|
||||||
{
|
{
|
||||||
return AbstractUpdatePolicy.IGNORED;
|
return AbstractUpdatePolicy.IGNORED;
|
||||||
}
|
}
|
||||||
|
@ -47,4 +47,9 @@ public class SnapshotsPolicy
|
||||||
{
|
{
|
||||||
return "snapshots";
|
return "snapshots";
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public String getId()
|
||||||
|
{
|
||||||
|
return "snapshots";
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -20,6 +20,7 @@ package org.apache.maven.archiva.proxy;
|
||||||
*/
|
*/
|
||||||
|
|
||||||
import org.apache.commons.io.FileUtils;
|
import org.apache.commons.io.FileUtils;
|
||||||
|
import org.apache.commons.lang.StringUtils;
|
||||||
import org.apache.maven.archiva.configuration.ArchivaConfiguration;
|
import org.apache.maven.archiva.configuration.ArchivaConfiguration;
|
||||||
import org.apache.maven.archiva.configuration.ConfigurationNames;
|
import org.apache.maven.archiva.configuration.ConfigurationNames;
|
||||||
import org.apache.maven.archiva.configuration.NetworkProxyConfiguration;
|
import org.apache.maven.archiva.configuration.NetworkProxyConfiguration;
|
||||||
|
@ -494,7 +495,7 @@ public class DefaultRepositoryProxyConnectors
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private boolean applyPolicies( Properties policySettings, Map downloadPolicies, Properties request, File localFile )
|
private boolean applyPolicies( Map policySettings, Map downloadPolicies, Properties request, File localFile )
|
||||||
{
|
{
|
||||||
Iterator it = downloadPolicies.entrySet().iterator();
|
Iterator it = downloadPolicies.entrySet().iterator();
|
||||||
while ( it.hasNext() )
|
while ( it.hasNext() )
|
||||||
|
@ -502,8 +503,8 @@ public class DefaultRepositoryProxyConnectors
|
||||||
Map.Entry entry = (Entry) it.next();
|
Map.Entry entry = (Entry) it.next();
|
||||||
String key = (String) entry.getKey();
|
String key = (String) entry.getKey();
|
||||||
DownloadPolicy policy = (DownloadPolicy) entry.getValue();
|
DownloadPolicy policy = (DownloadPolicy) entry.getValue();
|
||||||
String defaultSetting = policy.getDefaultPolicySetting();
|
String defaultSetting = policy.getDefaultOption();
|
||||||
String setting = policySettings.getProperty( key, defaultSetting );
|
String setting = StringUtils.defaultString( (String) policySettings.get( key ), defaultSetting );
|
||||||
|
|
||||||
getLogger().debug( "Applying [" + key + "] policy with [" + setting + "]" );
|
getLogger().debug( "Applying [" + key + "] policy with [" + setting + "]" );
|
||||||
if ( !policy.applyPolicy( setting, request, localFile ) )
|
if ( !policy.applyPolicy( setting, request, localFile ) )
|
||||||
|
|
|
@ -22,9 +22,9 @@ package org.apache.maven.archiva.proxy;
|
||||||
import org.apache.maven.archiva.model.ArchivaRepository;
|
import org.apache.maven.archiva.model.ArchivaRepository;
|
||||||
import org.apache.maven.archiva.repository.connector.RepositoryConnector;
|
import org.apache.maven.archiva.repository.connector.RepositoryConnector;
|
||||||
|
|
||||||
import java.util.Enumeration;
|
import java.util.Iterator;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
import java.util.Properties;
|
import java.util.Map;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* This represents a connector for a repository to repository proxy.
|
* This represents a connector for a repository to repository proxy.
|
||||||
|
@ -45,7 +45,7 @@ public class ProxyConnector
|
||||||
|
|
||||||
private String proxyId;
|
private String proxyId;
|
||||||
|
|
||||||
private Properties policies;
|
private Map policies;
|
||||||
|
|
||||||
public List getBlacklist()
|
public List getBlacklist()
|
||||||
{
|
{
|
||||||
|
@ -87,12 +87,12 @@ public class ProxyConnector
|
||||||
this.whitelist = whitelist;
|
this.whitelist = whitelist;
|
||||||
}
|
}
|
||||||
|
|
||||||
public Properties getPolicies()
|
public Map getPolicies()
|
||||||
{
|
{
|
||||||
return policies;
|
return policies;
|
||||||
}
|
}
|
||||||
|
|
||||||
public void setPolicies( Properties policies )
|
public void setPolicies( Map policies )
|
||||||
{
|
{
|
||||||
this.policies = policies;
|
this.policies = policies;
|
||||||
}
|
}
|
||||||
|
@ -116,12 +116,12 @@ public class ProxyConnector
|
||||||
sb.append( " target:" ).append( this.targetRepository ).append( "\n" );
|
sb.append( " target:" ).append( this.targetRepository ).append( "\n" );
|
||||||
sb.append( " proxyId:" ).append( this.proxyId ).append( "\n" );
|
sb.append( " proxyId:" ).append( this.proxyId ).append( "\n" );
|
||||||
|
|
||||||
Enumeration keys = this.policies.propertyNames();
|
Iterator keys = this.policies.keySet().iterator();
|
||||||
while ( keys.hasMoreElements() )
|
while ( keys.hasNext() )
|
||||||
{
|
{
|
||||||
String name = (String) keys.nextElement();
|
String name = (String) keys.next();
|
||||||
sb.append( " policy[" ).append( name ).append( "]:" );
|
sb.append( " policy[" ).append( name ).append( "]:" );
|
||||||
sb.append( this.policies.getProperty( name ) ).append( "\n" );
|
sb.append( this.policies.get( name ) ).append( "\n" );
|
||||||
}
|
}
|
||||||
|
|
||||||
sb.append( "]" );
|
sb.append( "]" );
|
||||||
|
@ -131,6 +131,6 @@ public class ProxyConnector
|
||||||
|
|
||||||
public void setPolicy( String policyId, String policySetting )
|
public void setPolicy( String policyId, String policySetting )
|
||||||
{
|
{
|
||||||
// TODO Auto-generated method stub
|
this.policies.put( policyId, policySetting );
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,150 +0,0 @@
|
||||||
package org.apache.maven.archiva.web.action.admin;
|
|
||||||
|
|
||||||
/*
|
|
||||||
* 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.
|
|
||||||
*/
|
|
||||||
|
|
||||||
//import org.apache.maven.archiva.configuration.AbstractRepositoryConfiguration;
|
|
||||||
import org.apache.maven.archiva.configuration.ArchivaConfiguration;
|
|
||||||
import org.apache.maven.archiva.configuration.Configuration;
|
|
||||||
import org.apache.maven.archiva.configuration.InvalidConfigurationException;
|
|
||||||
import org.apache.maven.archiva.security.ArchivaRoleConstants;
|
|
||||||
import org.codehaus.plexus.rbac.profile.RoleProfileManager;
|
|
||||||
import org.codehaus.plexus.registry.RegistryException;
|
|
||||||
import org.codehaus.plexus.security.rbac.Resource;
|
|
||||||
import org.codehaus.plexus.security.ui.web.interceptor.SecureAction;
|
|
||||||
import org.codehaus.plexus.security.ui.web.interceptor.SecureActionBundle;
|
|
||||||
import org.codehaus.plexus.security.ui.web.interceptor.SecureActionException;
|
|
||||||
import org.codehaus.plexus.xwork.action.PlexusActionSupport;
|
|
||||||
|
|
||||||
import java.io.IOException;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Base action for repository removal actions.
|
|
||||||
*
|
|
||||||
* @author <a href="mailto:brett@apache.org">Brett Porter</a>
|
|
||||||
*/
|
|
||||||
public abstract class AbstractDeleteRepositoryAction
|
|
||||||
extends PlexusActionSupport
|
|
||||||
implements SecureAction
|
|
||||||
{
|
|
||||||
/**
|
|
||||||
* @plexus.requirement
|
|
||||||
*/
|
|
||||||
private ArchivaConfiguration archivaConfiguration;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* The repository ID to lookup when editing a repository.
|
|
||||||
*/
|
|
||||||
protected String repoId;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Which operation to select.
|
|
||||||
*/
|
|
||||||
private String operation = "unmodified";
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @plexus.requirement role-hint="archiva"
|
|
||||||
*/
|
|
||||||
protected RoleProfileManager roleProfileManager;
|
|
||||||
|
|
||||||
public String execute()
|
|
||||||
throws IOException, InvalidConfigurationException, RegistryException
|
|
||||||
{
|
|
||||||
// TODO: if this didn't come from the form, go to configure.action instead of going through with re-saving what was just loaded
|
|
||||||
|
|
||||||
if ( "delete-entry".equals( operation ) || "delete-contents".equals( operation ) )
|
|
||||||
{
|
|
||||||
Configuration configuration = archivaConfiguration.getConfiguration();
|
|
||||||
|
|
||||||
// AbstractRepositoryConfiguration existingRepository = getRepository( configuration );
|
|
||||||
// if ( existingRepository == null )
|
|
||||||
// {
|
|
||||||
// addActionError( "A repository with that id does not exist" );
|
|
||||||
// return ERROR;
|
|
||||||
// }
|
|
||||||
//
|
|
||||||
// // TODO: remove from index too!
|
|
||||||
//
|
|
||||||
// removeRepository( configuration, existingRepository );
|
|
||||||
//
|
|
||||||
// archivaConfiguration.save( configuration );
|
|
||||||
//
|
|
||||||
// if ( "delete-contents".equals( operation ) )
|
|
||||||
// {
|
|
||||||
// removeContents( existingRepository );
|
|
||||||
// }
|
|
||||||
}
|
|
||||||
|
|
||||||
return SUCCESS;
|
|
||||||
}
|
|
||||||
|
|
||||||
// protected abstract void removeContents( AbstractRepositoryConfiguration existingRepository )
|
|
||||||
// throws IOException;
|
|
||||||
//
|
|
||||||
// protected abstract AbstractRepositoryConfiguration getRepository( Configuration configuration );
|
|
||||||
//
|
|
||||||
// protected abstract void removeRepository( Configuration configuration,
|
|
||||||
// AbstractRepositoryConfiguration existingRepository );
|
|
||||||
|
|
||||||
public String input()
|
|
||||||
{
|
|
||||||
return INPUT;
|
|
||||||
}
|
|
||||||
|
|
||||||
public String getRepoId()
|
|
||||||
{
|
|
||||||
return repoId;
|
|
||||||
}
|
|
||||||
|
|
||||||
public void setRepoId( String repoId )
|
|
||||||
{
|
|
||||||
this.repoId = repoId;
|
|
||||||
}
|
|
||||||
|
|
||||||
public String getOperation()
|
|
||||||
{
|
|
||||||
return operation;
|
|
||||||
}
|
|
||||||
|
|
||||||
public void setOperation( String operation )
|
|
||||||
{
|
|
||||||
this.operation = operation;
|
|
||||||
}
|
|
||||||
|
|
||||||
public SecureActionBundle getSecureActionBundle()
|
|
||||||
throws SecureActionException
|
|
||||||
{
|
|
||||||
SecureActionBundle bundle = new SecureActionBundle();
|
|
||||||
|
|
||||||
bundle.setRequiresAuthentication( true );
|
|
||||||
|
|
||||||
if ( getRepoId() != null )
|
|
||||||
{
|
|
||||||
// TODO: not right. We only care about this permission on managed repositories. Otherwise, it's configuration
|
|
||||||
bundle.addRequiredAuthorization( ArchivaRoleConstants.OPERATION_DELETE_REPOSITORY, getRepoId() );
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
bundle.addRequiredAuthorization( ArchivaRoleConstants.OPERATION_MANAGE_CONFIGURATION, Resource.GLOBAL );
|
|
||||||
}
|
|
||||||
|
|
||||||
return bundle;
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
|
@ -1,208 +0,0 @@
|
||||||
package org.apache.maven.archiva.web.action.admin;
|
|
||||||
|
|
||||||
/*
|
|
||||||
* 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.
|
|
||||||
*/
|
|
||||||
|
|
||||||
import com.opensymphony.xwork.ActionContext;
|
|
||||||
import com.opensymphony.xwork.ModelDriven;
|
|
||||||
import com.opensymphony.xwork.Preparable;
|
|
||||||
|
|
||||||
import org.apache.maven.archiva.configuration.ArchivaConfiguration;
|
|
||||||
import org.apache.maven.archiva.configuration.InvalidConfigurationException;
|
|
||||||
import org.apache.maven.archiva.configuration.RepositoryConfiguration;
|
|
||||||
import org.apache.maven.archiva.security.ArchivaRoleConstants;
|
|
||||||
import org.apache.maven.archiva.web.action.admin.models.AdminRepositoryConfiguration;
|
|
||||||
import org.codehaus.plexus.rbac.profile.RoleProfileException;
|
|
||||||
import org.codehaus.plexus.rbac.profile.RoleProfileManager;
|
|
||||||
import org.codehaus.plexus.registry.RegistryException;
|
|
||||||
import org.codehaus.plexus.security.authorization.AuthorizationException;
|
|
||||||
import org.codehaus.plexus.security.authorization.AuthorizationResult;
|
|
||||||
import org.codehaus.plexus.security.rbac.RbacManagerException;
|
|
||||||
import org.codehaus.plexus.security.rbac.Resource;
|
|
||||||
import org.codehaus.plexus.security.system.SecuritySession;
|
|
||||||
import org.codehaus.plexus.security.system.SecuritySystem;
|
|
||||||
import org.codehaus.plexus.security.ui.web.interceptor.SecureAction;
|
|
||||||
import org.codehaus.plexus.security.ui.web.interceptor.SecureActionBundle;
|
|
||||||
import org.codehaus.plexus.security.ui.web.interceptor.SecureActionException;
|
|
||||||
import org.codehaus.plexus.xwork.action.PlexusActionSupport;
|
|
||||||
|
|
||||||
import java.io.File;
|
|
||||||
import java.io.IOException;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* AbstractRepositoryAction
|
|
||||||
*
|
|
||||||
* @author <a href="mailto:joakim@erdfelt.com">Joakim Erdfelt</a>
|
|
||||||
* @version $Id$
|
|
||||||
*/
|
|
||||||
public abstract class AbstractRepositoryAction
|
|
||||||
extends PlexusActionSupport
|
|
||||||
implements ModelDriven, Preparable, SecureAction
|
|
||||||
{
|
|
||||||
protected static final String SUCCESS = "success";
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @plexus.requirement role-hint="archiva"
|
|
||||||
*/
|
|
||||||
private RoleProfileManager roleProfileManager;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @plexus.requirement
|
|
||||||
*/
|
|
||||||
private SecuritySystem securitySystem;
|
|
||||||
|
|
||||||
private String repoid;
|
|
||||||
|
|
||||||
private String mode;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @plexus.requirement
|
|
||||||
*/
|
|
||||||
protected ArchivaConfiguration archivaConfiguration;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* The model for this action.
|
|
||||||
*/
|
|
||||||
protected AdminRepositoryConfiguration repository;
|
|
||||||
|
|
||||||
public String getMode()
|
|
||||||
{
|
|
||||||
return this.mode;
|
|
||||||
}
|
|
||||||
|
|
||||||
public Object getModel()
|
|
||||||
{
|
|
||||||
return getRepository();
|
|
||||||
}
|
|
||||||
|
|
||||||
public String getRepoid()
|
|
||||||
{
|
|
||||||
return repoid;
|
|
||||||
}
|
|
||||||
|
|
||||||
public SecureActionBundle getSecureActionBundle()
|
|
||||||
throws SecureActionException
|
|
||||||
{
|
|
||||||
SecureActionBundle bundle = new SecureActionBundle();
|
|
||||||
|
|
||||||
bundle.setRequiresAuthentication( true );
|
|
||||||
bundle.addRequiredAuthorization( ArchivaRoleConstants.OPERATION_MANAGE_CONFIGURATION, Resource.GLOBAL );
|
|
||||||
|
|
||||||
return bundle;
|
|
||||||
}
|
|
||||||
|
|
||||||
public String input()
|
|
||||||
{
|
|
||||||
getLogger().info( "input()" );
|
|
||||||
return INPUT;
|
|
||||||
}
|
|
||||||
|
|
||||||
public abstract void prepare()
|
|
||||||
throws Exception;
|
|
||||||
|
|
||||||
public void setMode( String mode )
|
|
||||||
{
|
|
||||||
this.mode = mode;
|
|
||||||
}
|
|
||||||
|
|
||||||
public void setRepoid( String repoid )
|
|
||||||
{
|
|
||||||
this.repoid = repoid;
|
|
||||||
}
|
|
||||||
|
|
||||||
protected void addRepository( AdminRepositoryConfiguration repository )
|
|
||||||
throws IOException, RoleProfileException
|
|
||||||
{
|
|
||||||
getLogger().info( ".addRepository(" + repository + ")" );
|
|
||||||
|
|
||||||
if ( repository.isManaged() )
|
|
||||||
{
|
|
||||||
// Normalize the path
|
|
||||||
File file = new File( repository.getDirectory() );
|
|
||||||
repository.setDirectory( file.getCanonicalPath() );
|
|
||||||
if ( !file.exists() )
|
|
||||||
{
|
|
||||||
file.mkdirs();
|
|
||||||
// TODO: error handling when this fails, or is not a directory!
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
archivaConfiguration.getConfiguration().addRepository( repository );
|
|
||||||
|
|
||||||
// TODO: double check these are configured on start up
|
|
||||||
roleProfileManager.getDynamicRole( "archiva-repository-manager", repository.getId() );
|
|
||||||
|
|
||||||
roleProfileManager.getDynamicRole( "archiva-repository-observer", repository.getId() );
|
|
||||||
}
|
|
||||||
|
|
||||||
protected AdminRepositoryConfiguration getRepository()
|
|
||||||
{
|
|
||||||
if ( repository == null )
|
|
||||||
{
|
|
||||||
repository = new AdminRepositoryConfiguration();
|
|
||||||
}
|
|
||||||
|
|
||||||
return repository;
|
|
||||||
}
|
|
||||||
|
|
||||||
protected boolean operationAllowed( String permission, String repoid )
|
|
||||||
{
|
|
||||||
ActionContext context = ActionContext.getContext();
|
|
||||||
SecuritySession securitySession = (SecuritySession) context.get( SecuritySession.ROLE );
|
|
||||||
|
|
||||||
AuthorizationResult authzResult;
|
|
||||||
try
|
|
||||||
{
|
|
||||||
authzResult = securitySystem.authorize( securitySession, permission, repoid );
|
|
||||||
|
|
||||||
return authzResult.isAuthorized();
|
|
||||||
}
|
|
||||||
catch ( AuthorizationException e )
|
|
||||||
{
|
|
||||||
getLogger().info(
|
|
||||||
"Unable to authorize permission: " + permission + " against repo: " + repoid
|
|
||||||
+ " due to: " + e.getMessage() );
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
protected void removeRepository( String repoId )
|
|
||||||
{
|
|
||||||
getLogger().info( ".removeRepository()" );
|
|
||||||
|
|
||||||
RepositoryConfiguration toremove = archivaConfiguration.getConfiguration().findRepositoryById( repoId );
|
|
||||||
if ( toremove != null )
|
|
||||||
{
|
|
||||||
archivaConfiguration.getConfiguration().removeRepository( toremove );
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
protected String saveConfiguration()
|
|
||||||
throws IOException, InvalidConfigurationException, RbacManagerException, RoleProfileException,
|
|
||||||
RegistryException
|
|
||||||
{
|
|
||||||
getLogger().info( ".saveConfiguration()" );
|
|
||||||
|
|
||||||
archivaConfiguration.save( archivaConfiguration.getConfiguration() );
|
|
||||||
|
|
||||||
addActionMessage( "Successfully saved configuration" );
|
|
||||||
|
|
||||||
return SUCCESS;
|
|
||||||
}
|
|
||||||
}
|
|
|
@ -1,291 +0,0 @@
|
||||||
package org.apache.maven.archiva.web.action.admin;
|
|
||||||
|
|
||||||
/*
|
|
||||||
* 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.
|
|
||||||
*/
|
|
||||||
|
|
||||||
import com.opensymphony.xwork.ModelDriven;
|
|
||||||
import com.opensymphony.xwork.Preparable;
|
|
||||||
|
|
||||||
import org.apache.commons.lang.StringUtils;
|
|
||||||
import org.apache.maven.archiva.configuration.ArchivaConfiguration;
|
|
||||||
import org.apache.maven.archiva.configuration.Configuration;
|
|
||||||
import org.apache.maven.archiva.configuration.InvalidConfigurationException;
|
|
||||||
import org.apache.maven.archiva.configuration.RepositoryConfiguration;
|
|
||||||
import org.apache.maven.archiva.security.ArchivaRoleConstants;
|
|
||||||
import org.apache.maven.archiva.web.action.admin.models.AdminRepositoryConfiguration;
|
|
||||||
import org.codehaus.plexus.rbac.profile.RoleProfileException;
|
|
||||||
import org.codehaus.plexus.rbac.profile.RoleProfileManager;
|
|
||||||
import org.codehaus.plexus.registry.RegistryException;
|
|
||||||
import org.codehaus.plexus.security.rbac.RbacManagerException;
|
|
||||||
import org.codehaus.plexus.security.rbac.Resource;
|
|
||||||
import org.codehaus.plexus.security.ui.web.interceptor.SecureAction;
|
|
||||||
import org.codehaus.plexus.security.ui.web.interceptor.SecureActionBundle;
|
|
||||||
import org.codehaus.plexus.security.ui.web.interceptor.SecureActionException;
|
|
||||||
import org.codehaus.plexus.xwork.action.PlexusActionSupport;
|
|
||||||
|
|
||||||
import java.io.File;
|
|
||||||
import java.io.IOException;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Configures the application repositories.
|
|
||||||
*
|
|
||||||
* @plexus.component role="com.opensymphony.xwork.Action" role-hint="configureRepositoryAction"
|
|
||||||
*/
|
|
||||||
public class ConfigureRepositoryAction
|
|
||||||
extends PlexusActionSupport
|
|
||||||
implements ModelDriven, Preparable, SecureAction
|
|
||||||
{
|
|
||||||
/**
|
|
||||||
* @plexus.requirement
|
|
||||||
*/
|
|
||||||
private ArchivaConfiguration archivaConfiguration;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @plexus.requirement role-hint="archiva"
|
|
||||||
*/
|
|
||||||
private RoleProfileManager roleProfileManager;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* The repository.
|
|
||||||
*/
|
|
||||||
private AdminRepositoryConfiguration repository;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* The repository ID to lookup when editing a repository.
|
|
||||||
*/
|
|
||||||
private String repoId;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* The previously read configuration.
|
|
||||||
*/
|
|
||||||
private Configuration configuration;
|
|
||||||
|
|
||||||
public String add()
|
|
||||||
throws IOException, InvalidConfigurationException, RbacManagerException, RoleProfileException,
|
|
||||||
RegistryException
|
|
||||||
{
|
|
||||||
// TODO: if this didn't come from the form, go to configure.action instead of going through with re-saving what was just loaded
|
|
||||||
getLogger().info( ".add()" );
|
|
||||||
|
|
||||||
AdminRepositoryConfiguration existingRepository = getRepository( repository.getId() );
|
|
||||||
if ( existingRepository != null )
|
|
||||||
{
|
|
||||||
addFieldError( "id", "A repository with that id already exists" );
|
|
||||||
return INPUT;
|
|
||||||
}
|
|
||||||
|
|
||||||
return saveConfiguration();
|
|
||||||
}
|
|
||||||
|
|
||||||
public String edit()
|
|
||||||
throws IOException, InvalidConfigurationException, RbacManagerException, RoleProfileException,
|
|
||||||
RegistryException
|
|
||||||
{
|
|
||||||
// TODO: if this didn't come from the form, go to configure.action instead of going through with re-saving what was just loaded
|
|
||||||
getLogger().info( ".edit()" );
|
|
||||||
|
|
||||||
if ( StringUtils.isBlank( repository.getId() ) )
|
|
||||||
{
|
|
||||||
addFieldError( "id", "A repository with a blank id cannot be editted." );
|
|
||||||
return INPUT;
|
|
||||||
}
|
|
||||||
|
|
||||||
removeRepository( getRepository() );
|
|
||||||
|
|
||||||
addRepository();
|
|
||||||
|
|
||||||
return saveConfiguration();
|
|
||||||
}
|
|
||||||
|
|
||||||
public Configuration getConfiguration()
|
|
||||||
{
|
|
||||||
return configuration;
|
|
||||||
}
|
|
||||||
|
|
||||||
public Object getModel()
|
|
||||||
{
|
|
||||||
getLogger().info( ".getModel()" );
|
|
||||||
if( repository == null )
|
|
||||||
{
|
|
||||||
repository = createRepository();
|
|
||||||
}
|
|
||||||
|
|
||||||
return repository;
|
|
||||||
}
|
|
||||||
|
|
||||||
public String getRepoId()
|
|
||||||
{
|
|
||||||
return repoId;
|
|
||||||
}
|
|
||||||
|
|
||||||
public SecureActionBundle getSecureActionBundle()
|
|
||||||
throws SecureActionException
|
|
||||||
{
|
|
||||||
SecureActionBundle bundle = new SecureActionBundle();
|
|
||||||
|
|
||||||
bundle.setRequiresAuthentication( true );
|
|
||||||
|
|
||||||
if ( getRepoId() != null )
|
|
||||||
{
|
|
||||||
// TODO: this is not right. It needs to change based on method. But is this really the right way to restrict this area?
|
|
||||||
// TODO: not right. We only care about this permission on managed repositories. Otherwise, it's configuration
|
|
||||||
bundle.addRequiredAuthorization( ArchivaRoleConstants.OPERATION_EDIT_REPOSITORY, getRepoId() );
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
bundle.addRequiredAuthorization( ArchivaRoleConstants.OPERATION_MANAGE_CONFIGURATION, Resource.GLOBAL );
|
|
||||||
}
|
|
||||||
|
|
||||||
return bundle;
|
|
||||||
}
|
|
||||||
|
|
||||||
public String input()
|
|
||||||
{
|
|
||||||
getLogger().info( ".input()" );
|
|
||||||
return INPUT;
|
|
||||||
}
|
|
||||||
|
|
||||||
public String doDefault()
|
|
||||||
throws Exception
|
|
||||||
{
|
|
||||||
getLogger().info( ".doDefault()" );
|
|
||||||
return super.doDefault();
|
|
||||||
}
|
|
||||||
|
|
||||||
public String doInput()
|
|
||||||
throws Exception
|
|
||||||
{
|
|
||||||
getLogger().info( ".doInput()" );
|
|
||||||
return super.doInput();
|
|
||||||
}
|
|
||||||
|
|
||||||
public void validate()
|
|
||||||
{
|
|
||||||
getLogger().info( ".validate()" );
|
|
||||||
// super.validate();
|
|
||||||
}
|
|
||||||
|
|
||||||
public String execute()
|
|
||||||
throws Exception
|
|
||||||
{
|
|
||||||
getLogger().info( ".execute()" );
|
|
||||||
return super.execute();
|
|
||||||
}
|
|
||||||
|
|
||||||
public void prepare()
|
|
||||||
{
|
|
||||||
getLogger().info( ".prepare()" );
|
|
||||||
configuration = archivaConfiguration.getConfiguration();
|
|
||||||
|
|
||||||
if ( repository == null )
|
|
||||||
{
|
|
||||||
repository = getRepository( repoId );
|
|
||||||
}
|
|
||||||
if ( repository == null )
|
|
||||||
{
|
|
||||||
repository = createRepository();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
public void setRepoId( String repoId )
|
|
||||||
{
|
|
||||||
this.repoId = repoId;
|
|
||||||
}
|
|
||||||
|
|
||||||
private void addRepository()
|
|
||||||
throws IOException, RoleProfileException
|
|
||||||
{
|
|
||||||
getLogger().info( ".addRepository()" );
|
|
||||||
AdminRepositoryConfiguration repository = (AdminRepositoryConfiguration) getRepository();
|
|
||||||
|
|
||||||
if ( repository.isManaged() )
|
|
||||||
{
|
|
||||||
// Normalize the path
|
|
||||||
File file = new File( repository.getDirectory() );
|
|
||||||
repository.setDirectory( file.getCanonicalPath() );
|
|
||||||
if ( !file.exists() )
|
|
||||||
{
|
|
||||||
file.mkdirs();
|
|
||||||
// TODO: error handling when this fails, or is not a directory!
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
configuration.addRepository( repository );
|
|
||||||
|
|
||||||
// TODO: double check these are configured on start up
|
|
||||||
roleProfileManager.getDynamicRole( "archiva-repository-manager", repository.getId() );
|
|
||||||
|
|
||||||
roleProfileManager.getDynamicRole( "archiva-repository-observer", repository.getId() );
|
|
||||||
}
|
|
||||||
|
|
||||||
private AdminRepositoryConfiguration createRepository()
|
|
||||||
{
|
|
||||||
getLogger().info( ".createRepository()" );
|
|
||||||
AdminRepositoryConfiguration repository = new AdminRepositoryConfiguration();
|
|
||||||
repository.setIndexed( false );
|
|
||||||
return repository;
|
|
||||||
}
|
|
||||||
|
|
||||||
private AdminRepositoryConfiguration getRepository()
|
|
||||||
{
|
|
||||||
return repository;
|
|
||||||
}
|
|
||||||
|
|
||||||
private AdminRepositoryConfiguration getRepository( String id )
|
|
||||||
{
|
|
||||||
getLogger().info( ".getRepository(" + id + ")" );
|
|
||||||
|
|
||||||
RepositoryConfiguration repoconfig = configuration.findRepositoryById( id );
|
|
||||||
if ( repoconfig == null )
|
|
||||||
{
|
|
||||||
return createRepository();
|
|
||||||
}
|
|
||||||
return new AdminRepositoryConfiguration( repoconfig );
|
|
||||||
}
|
|
||||||
|
|
||||||
private boolean removeRepository( RepositoryConfiguration existingRepository )
|
|
||||||
{
|
|
||||||
getLogger().info( ".removeRepository()" );
|
|
||||||
|
|
||||||
RepositoryConfiguration toremove = configuration.findRepositoryById( existingRepository.getId() );
|
|
||||||
if ( toremove != null )
|
|
||||||
{
|
|
||||||
configuration.removeRepository( toremove );
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
private String saveConfiguration()
|
|
||||||
throws IOException, InvalidConfigurationException, RbacManagerException, RoleProfileException,
|
|
||||||
RegistryException
|
|
||||||
{
|
|
||||||
getLogger().info( ".saveConfiguration()" );
|
|
||||||
addRepository();
|
|
||||||
|
|
||||||
archivaConfiguration.save( configuration );
|
|
||||||
|
|
||||||
// TODO: do we need to check if indexing is needed?
|
|
||||||
|
|
||||||
addActionMessage( "Successfully saved configuration" );
|
|
||||||
|
|
||||||
return SUCCESS;
|
|
||||||
}
|
|
||||||
}
|
|
|
@ -1,79 +0,0 @@
|
||||||
package org.apache.maven.archiva.web.action.admin;
|
|
||||||
|
|
||||||
/*
|
|
||||||
* 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.
|
|
||||||
*/
|
|
||||||
|
|
||||||
//import org.apache.maven.archiva.configuration.AbstractRepositoryConfiguration;
|
|
||||||
import org.apache.maven.archiva.configuration.Configuration;
|
|
||||||
import org.apache.maven.archiva.configuration.RepositoryConfiguration;
|
|
||||||
import org.codehaus.plexus.rbac.profile.RoleProfileException;
|
|
||||||
import org.codehaus.plexus.util.FileUtils;
|
|
||||||
|
|
||||||
import java.io.IOException;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Configures the application repositories.
|
|
||||||
*
|
|
||||||
* @plexus.component role="com.opensymphony.xwork.Action" role-hint="deleteRepositoryAction"
|
|
||||||
*/
|
|
||||||
public class DeleteRepositoryAction
|
|
||||||
extends AbstractDeleteRepositoryAction
|
|
||||||
{
|
|
||||||
// protected AbstractRepositoryConfiguration getRepository( Configuration configuration )
|
|
||||||
// {
|
|
||||||
// return configuration.getRepositoryById( repoId );
|
|
||||||
// }
|
|
||||||
//
|
|
||||||
// protected void removeRepository( Configuration configuration, AbstractRepositoryConfiguration existingRepository )
|
|
||||||
// {
|
|
||||||
// configuration.removeRepository( (RepositoryConfiguration) existingRepository );
|
|
||||||
//
|
|
||||||
// try
|
|
||||||
// {
|
|
||||||
// removeRepositoryRoles( existingRepository );
|
|
||||||
// }
|
|
||||||
// catch ( RoleProfileException e )
|
|
||||||
// {
|
|
||||||
// getLogger().error( "Error removing user roles associated with repository " + existingRepository.getId() );
|
|
||||||
// }
|
|
||||||
// }
|
|
||||||
//
|
|
||||||
// protected void removeContents( AbstractRepositoryConfiguration existingRepository )
|
|
||||||
// throws IOException
|
|
||||||
// {
|
|
||||||
// RepositoryConfiguration repository = (RepositoryConfiguration) existingRepository;
|
|
||||||
// getLogger().info( "Removing " + repository.getDirectory() );
|
|
||||||
// FileUtils.deleteDirectory( repository.getDirectory() );
|
|
||||||
// }
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Remove user roles associated with the repository
|
|
||||||
*
|
|
||||||
* @param existingRepository
|
|
||||||
* @throws RoleProfileException
|
|
||||||
*/
|
|
||||||
// private void removeRepositoryRoles( AbstractRepositoryConfiguration existingRepository )
|
|
||||||
// throws RoleProfileException
|
|
||||||
// {
|
|
||||||
// roleProfileManager.deleteDynamicRole( "archiva-repository-manager", existingRepository.getId() );
|
|
||||||
// roleProfileManager.deleteDynamicRole( "archiva-repository-observer", existingRepository.getId() );
|
|
||||||
//
|
|
||||||
// getLogger().info( "removed user roles associated with repository " + existingRepository.getId() );
|
|
||||||
// }
|
|
||||||
}
|
|
|
@ -1,71 +0,0 @@
|
||||||
package org.apache.maven.archiva.web.action.admin;
|
|
||||||
|
|
||||||
/*
|
|
||||||
* 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.
|
|
||||||
*/
|
|
||||||
|
|
||||||
import org.apache.maven.archiva.configuration.RepositoryConfiguration;
|
|
||||||
import org.apache.maven.archiva.security.ArchivaRoleConstants;
|
|
||||||
import org.apache.maven.archiva.web.action.admin.models.AdminRepositoryConfiguration;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* EditRepositoryAction
|
|
||||||
*
|
|
||||||
* @author <a href="mailto:joakim@erdfelt.com">Joakim Erdfelt</a>
|
|
||||||
* @version $Id$
|
|
||||||
*
|
|
||||||
* @plexus.component role="com.opensymphony.xwork.Action" role-hint="editRepositoryAction"
|
|
||||||
*/
|
|
||||||
public class EditRepositoryAction
|
|
||||||
extends AbstractRepositoryAction
|
|
||||||
{
|
|
||||||
public String edit()
|
|
||||||
{
|
|
||||||
getLogger().info( ".edit()" );
|
|
||||||
|
|
||||||
if ( operationAllowed( ArchivaRoleConstants.OPERATION_EDIT_REPOSITORY, getRepoid() ) )
|
|
||||||
{
|
|
||||||
addActionError( "You do not have the appropriate permissions to edit the " + getRepoid() + " repository." );
|
|
||||||
return ERROR;
|
|
||||||
}
|
|
||||||
|
|
||||||
return INPUT;
|
|
||||||
}
|
|
||||||
|
|
||||||
public void prepare()
|
|
||||||
throws Exception
|
|
||||||
{
|
|
||||||
String id = getRepoid();
|
|
||||||
if ( id == null )
|
|
||||||
{
|
|
||||||
// TODO: Throw error?
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
RepositoryConfiguration repoconfig = archivaConfiguration.getConfiguration().findRepositoryById( id );
|
|
||||||
if ( repoconfig != null )
|
|
||||||
{
|
|
||||||
this.repository = new AdminRepositoryConfiguration( repoconfig );
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
public String getMode()
|
|
||||||
{
|
|
||||||
return "edit";
|
|
||||||
}
|
|
||||||
}
|
|
|
@ -1,93 +0,0 @@
|
||||||
package org.apache.maven.archiva.web.action.admin;
|
|
||||||
|
|
||||||
/*
|
|
||||||
* 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.
|
|
||||||
*/
|
|
||||||
|
|
||||||
import org.apache.commons.lang.StringUtils;
|
|
||||||
import org.apache.maven.archiva.configuration.InvalidConfigurationException;
|
|
||||||
import org.codehaus.plexus.rbac.profile.RoleProfileException;
|
|
||||||
import org.codehaus.plexus.registry.RegistryException;
|
|
||||||
import org.codehaus.plexus.security.rbac.RbacManagerException;
|
|
||||||
|
|
||||||
import java.io.IOException;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* SaveRepositoryAction
|
|
||||||
*
|
|
||||||
* @author <a href="mailto:joakim@erdfelt.com">Joakim Erdfelt</a>
|
|
||||||
* @version $Id$
|
|
||||||
*
|
|
||||||
* @plexus.component role="com.opensymphony.xwork.Action" role-hint="saveRepositoryAction"
|
|
||||||
*/
|
|
||||||
public class SaveRepositoryAction
|
|
||||||
extends AbstractRepositoryAction
|
|
||||||
{
|
|
||||||
public void prepare()
|
|
||||||
throws Exception
|
|
||||||
{
|
|
||||||
/* nothing to do here */
|
|
||||||
}
|
|
||||||
|
|
||||||
public String save()
|
|
||||||
{
|
|
||||||
String mode = getMode();
|
|
||||||
String repoId = getRepository().getId();
|
|
||||||
|
|
||||||
getLogger().info( "edit(" + mode + ":" + repoId + ")" );
|
|
||||||
|
|
||||||
if ( StringUtils.isBlank( repository.getId() ) )
|
|
||||||
{
|
|
||||||
addFieldError( "id", "A repository with a blank id cannot be saved." );
|
|
||||||
return SUCCESS;
|
|
||||||
}
|
|
||||||
|
|
||||||
if( StringUtils.equalsIgnoreCase( "edit", mode ) )
|
|
||||||
{
|
|
||||||
removeRepository( repoId );
|
|
||||||
}
|
|
||||||
|
|
||||||
try
|
|
||||||
{
|
|
||||||
addRepository( getRepository() );
|
|
||||||
saveConfiguration();
|
|
||||||
}
|
|
||||||
catch ( IOException e )
|
|
||||||
{
|
|
||||||
addActionError( "I/O Exception: " + e.getMessage() );
|
|
||||||
}
|
|
||||||
catch ( RoleProfileException e )
|
|
||||||
{
|
|
||||||
addActionError( "Role Profile Exception: " + e.getMessage() );
|
|
||||||
}
|
|
||||||
catch ( InvalidConfigurationException e )
|
|
||||||
{
|
|
||||||
addActionError( "Invalid Configuration Exception: " + e.getMessage() );
|
|
||||||
}
|
|
||||||
catch ( RbacManagerException e )
|
|
||||||
{
|
|
||||||
addActionError( "RBAC Manager Exception: " + e.getMessage() );
|
|
||||||
}
|
|
||||||
catch ( RegistryException e )
|
|
||||||
{
|
|
||||||
addActionError( "Configuration Registry Exception: " + e.getMessage() );
|
|
||||||
}
|
|
||||||
|
|
||||||
return SUCCESS;
|
|
||||||
}
|
|
||||||
}
|
|
|
@ -0,0 +1,606 @@
|
||||||
|
package org.apache.maven.archiva.web.action.admin.connectors.proxy;
|
||||||
|
|
||||||
|
/*
|
||||||
|
* 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.
|
||||||
|
*/
|
||||||
|
|
||||||
|
import com.opensymphony.xwork.Preparable;
|
||||||
|
|
||||||
|
import org.apache.commons.collections.Closure;
|
||||||
|
import org.apache.commons.collections.CollectionUtils;
|
||||||
|
import org.apache.commons.collections.functors.IfClosure;
|
||||||
|
import org.apache.commons.collections.functors.NotPredicate;
|
||||||
|
import org.apache.commons.lang.StringUtils;
|
||||||
|
import org.apache.maven.archiva.configuration.ArchivaConfiguration;
|
||||||
|
import org.apache.maven.archiva.configuration.Configuration;
|
||||||
|
import org.apache.maven.archiva.configuration.InvalidConfigurationException;
|
||||||
|
import org.apache.maven.archiva.configuration.NetworkProxyConfiguration;
|
||||||
|
import org.apache.maven.archiva.configuration.ProxyConnectorConfiguration;
|
||||||
|
import org.apache.maven.archiva.configuration.util.ProxyConnectorSelectionPredicate;
|
||||||
|
import org.apache.maven.archiva.configuration.util.RemoteRepositoryPredicate;
|
||||||
|
import org.apache.maven.archiva.configuration.util.RepositoryIdListClosure;
|
||||||
|
import org.apache.maven.archiva.policies.DownloadPolicy;
|
||||||
|
import org.apache.maven.archiva.security.ArchivaRoleConstants;
|
||||||
|
import org.codehaus.plexus.personality.plexus.lifecycle.phase.Initializable;
|
||||||
|
import org.codehaus.plexus.personality.plexus.lifecycle.phase.InitializationException;
|
||||||
|
import org.codehaus.plexus.registry.RegistryException;
|
||||||
|
import org.codehaus.plexus.security.rbac.Resource;
|
||||||
|
import org.codehaus.plexus.security.ui.web.interceptor.SecureAction;
|
||||||
|
import org.codehaus.plexus.security.ui.web.interceptor.SecureActionBundle;
|
||||||
|
import org.codehaus.plexus.security.ui.web.interceptor.SecureActionException;
|
||||||
|
import org.codehaus.plexus.xwork.action.PlexusActionSupport;
|
||||||
|
|
||||||
|
import java.io.IOException;
|
||||||
|
import java.util.ArrayList;
|
||||||
|
import java.util.HashMap;
|
||||||
|
import java.util.Iterator;
|
||||||
|
import java.util.List;
|
||||||
|
import java.util.Map;
|
||||||
|
import java.util.Map.Entry;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* ConfigureProxyConnectorAction
|
||||||
|
*
|
||||||
|
* @author <a href="mailto:joakim@erdfelt.com">Joakim Erdfelt</a>
|
||||||
|
* @version $Id$
|
||||||
|
*
|
||||||
|
* @plexus.component role="com.opensymphony.xwork.Action" role-hint="configureProxyConnectorAction"
|
||||||
|
*/
|
||||||
|
public class ConfigureProxyConnectorAction
|
||||||
|
extends PlexusActionSupport
|
||||||
|
implements SecureAction, Preparable, Initializable
|
||||||
|
{
|
||||||
|
private static final String DIRECT_CONNECTION = "(direct connection)";
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @plexus.requirement
|
||||||
|
*/
|
||||||
|
private ArchivaConfiguration archivaConfiguration;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @plexus.requirement role="org.apache.maven.archiva.policies.PreDownloadPolicy"
|
||||||
|
*/
|
||||||
|
private Map preDownloadPolicyMap;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @plexus.requirement role="org.apache.maven.archiva.policies.PostDownloadPolicy"
|
||||||
|
*/
|
||||||
|
private Map postDownloadPolicyMap;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* The model for this action.
|
||||||
|
*/
|
||||||
|
private ProxyConnectorConfiguration connector;
|
||||||
|
|
||||||
|
private Map policyMap;
|
||||||
|
|
||||||
|
private String source;
|
||||||
|
|
||||||
|
private String target;
|
||||||
|
|
||||||
|
private String mode;
|
||||||
|
|
||||||
|
private String propertyKey;
|
||||||
|
|
||||||
|
private String propertyValue;
|
||||||
|
|
||||||
|
private String pattern;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* The list of possible proxy ids.
|
||||||
|
*/
|
||||||
|
private List proxyIdOptions = new ArrayList();
|
||||||
|
|
||||||
|
/**
|
||||||
|
* The list of local repository ids.
|
||||||
|
*/
|
||||||
|
private List localRepoIdList = new ArrayList();
|
||||||
|
|
||||||
|
/**
|
||||||
|
* The list of remote repository ids.
|
||||||
|
*/
|
||||||
|
private List remoteRepoIdList = new ArrayList();
|
||||||
|
|
||||||
|
/**
|
||||||
|
* The blacklist pattern to add.
|
||||||
|
*/
|
||||||
|
private String blackListPattern;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* The whitelist pattern to add.
|
||||||
|
*/
|
||||||
|
private String whiteListPattern;
|
||||||
|
|
||||||
|
public String add()
|
||||||
|
{
|
||||||
|
getLogger().info( ".add()" );
|
||||||
|
this.mode = "add";
|
||||||
|
return INPUT;
|
||||||
|
}
|
||||||
|
|
||||||
|
public String confirm()
|
||||||
|
{
|
||||||
|
getLogger().info( ".confirm()" );
|
||||||
|
return INPUT;
|
||||||
|
}
|
||||||
|
|
||||||
|
public String delete()
|
||||||
|
{
|
||||||
|
getLogger().info( ".delete()" );
|
||||||
|
return INPUT;
|
||||||
|
}
|
||||||
|
|
||||||
|
public String addProperty()
|
||||||
|
{
|
||||||
|
getLogger().info( ".addProperty()" );
|
||||||
|
String key = getPropertyKey();
|
||||||
|
String value = getPropertyValue();
|
||||||
|
|
||||||
|
if ( StringUtils.isBlank( key ) )
|
||||||
|
{
|
||||||
|
addActionError( "Unable to add property with blank key." );
|
||||||
|
}
|
||||||
|
|
||||||
|
if ( StringUtils.isBlank( value ) )
|
||||||
|
{
|
||||||
|
addActionError( "Unable to add property with blank value." );
|
||||||
|
}
|
||||||
|
|
||||||
|
if ( !hasActionErrors() )
|
||||||
|
{
|
||||||
|
getConnector().getProperties().put( key, value );
|
||||||
|
setPropertyKey( null );
|
||||||
|
setPropertyValue( null );
|
||||||
|
}
|
||||||
|
|
||||||
|
return INPUT;
|
||||||
|
}
|
||||||
|
|
||||||
|
public String removeProperty()
|
||||||
|
{
|
||||||
|
getLogger().info( ".removeProperty()" );
|
||||||
|
String key = getPropertyKey();
|
||||||
|
|
||||||
|
if ( StringUtils.isBlank( key ) )
|
||||||
|
{
|
||||||
|
addActionError( "Unable to remove property with blank key." );
|
||||||
|
}
|
||||||
|
|
||||||
|
if ( !hasActionErrors() )
|
||||||
|
{
|
||||||
|
getConnector().getProperties().remove( key );
|
||||||
|
setPropertyKey( null );
|
||||||
|
setPropertyValue( null );
|
||||||
|
}
|
||||||
|
|
||||||
|
return INPUT;
|
||||||
|
}
|
||||||
|
|
||||||
|
public String addWhiteListPattern()
|
||||||
|
{
|
||||||
|
getLogger().info( ".addWhiteListPattern()" );
|
||||||
|
String pattern = getWhiteListPattern();
|
||||||
|
|
||||||
|
if ( StringUtils.isBlank( pattern ) )
|
||||||
|
{
|
||||||
|
addActionError( "Cannot add an blank white list pattern." );
|
||||||
|
}
|
||||||
|
|
||||||
|
if ( !hasActionErrors() )
|
||||||
|
{
|
||||||
|
getLogger().info(
|
||||||
|
"whitelist patterns: (" + getConnector().getWhiteListPatterns().size() + "): "
|
||||||
|
+ getConnector().getWhiteListPatterns() );
|
||||||
|
|
||||||
|
getConnector().getWhiteListPatterns().add( pattern );
|
||||||
|
setWhiteListPattern( null );
|
||||||
|
}
|
||||||
|
|
||||||
|
return INPUT;
|
||||||
|
}
|
||||||
|
|
||||||
|
public String removeWhiteListPattern()
|
||||||
|
{
|
||||||
|
String pattern = getPattern();
|
||||||
|
getLogger().info( ".removeWhiteListPattern(" + pattern + ")" );
|
||||||
|
|
||||||
|
if ( StringUtils.isBlank( pattern ) )
|
||||||
|
{
|
||||||
|
addActionError( "Cannot remove an blank white list pattern." );
|
||||||
|
}
|
||||||
|
|
||||||
|
if ( !hasActionErrors() )
|
||||||
|
{
|
||||||
|
getConnector().getWhiteListPatterns().remove( pattern );
|
||||||
|
setWhiteListPattern( null );
|
||||||
|
}
|
||||||
|
|
||||||
|
return INPUT;
|
||||||
|
}
|
||||||
|
|
||||||
|
public String addBlackListPattern()
|
||||||
|
{
|
||||||
|
getLogger().info( ".addBlackListPattern()" );
|
||||||
|
String pattern = getBlackListPattern();
|
||||||
|
|
||||||
|
if ( StringUtils.isBlank( pattern ) )
|
||||||
|
{
|
||||||
|
addActionError( "Cannot add an blank black list pattern." );
|
||||||
|
}
|
||||||
|
|
||||||
|
if ( !hasActionErrors() )
|
||||||
|
{
|
||||||
|
getConnector().getBlackListPatterns().add( pattern );
|
||||||
|
setBlackListPattern( null );
|
||||||
|
}
|
||||||
|
|
||||||
|
return INPUT;
|
||||||
|
}
|
||||||
|
|
||||||
|
public String removeBlackListPattern()
|
||||||
|
{
|
||||||
|
getLogger().info( ".removeBlackListPattern()" );
|
||||||
|
String pattern = getBlackListPattern();
|
||||||
|
|
||||||
|
if ( StringUtils.isBlank( pattern ) )
|
||||||
|
{
|
||||||
|
addActionError( "Cannot remove an blank black list pattern." );
|
||||||
|
}
|
||||||
|
|
||||||
|
if ( !hasActionErrors() )
|
||||||
|
{
|
||||||
|
getConnector().getBlackListPatterns().remove( pattern );
|
||||||
|
setBlackListPattern( null );
|
||||||
|
}
|
||||||
|
|
||||||
|
return INPUT;
|
||||||
|
}
|
||||||
|
|
||||||
|
public String edit()
|
||||||
|
{
|
||||||
|
getLogger().info( ".edit()" );
|
||||||
|
this.mode = "edit";
|
||||||
|
return INPUT;
|
||||||
|
}
|
||||||
|
|
||||||
|
public String getBlackListPattern()
|
||||||
|
{
|
||||||
|
return blackListPattern;
|
||||||
|
}
|
||||||
|
|
||||||
|
public ProxyConnectorConfiguration getConnector()
|
||||||
|
{
|
||||||
|
return connector;
|
||||||
|
}
|
||||||
|
|
||||||
|
public List getLocalRepoIdList()
|
||||||
|
{
|
||||||
|
return localRepoIdList;
|
||||||
|
}
|
||||||
|
|
||||||
|
public String getMode()
|
||||||
|
{
|
||||||
|
return this.mode;
|
||||||
|
}
|
||||||
|
|
||||||
|
public Map getPolicyMap()
|
||||||
|
{
|
||||||
|
return policyMap;
|
||||||
|
}
|
||||||
|
|
||||||
|
public String getPropertyKey()
|
||||||
|
{
|
||||||
|
return propertyKey;
|
||||||
|
}
|
||||||
|
|
||||||
|
public String getPropertyValue()
|
||||||
|
{
|
||||||
|
return propertyValue;
|
||||||
|
}
|
||||||
|
|
||||||
|
public List getProxyIdOptions()
|
||||||
|
{
|
||||||
|
return proxyIdOptions;
|
||||||
|
}
|
||||||
|
|
||||||
|
public List getRemoteRepoIdList()
|
||||||
|
{
|
||||||
|
return remoteRepoIdList;
|
||||||
|
}
|
||||||
|
|
||||||
|
public SecureActionBundle getSecureActionBundle()
|
||||||
|
throws SecureActionException
|
||||||
|
{
|
||||||
|
SecureActionBundle bundle = new SecureActionBundle();
|
||||||
|
|
||||||
|
bundle.setRequiresAuthentication( true );
|
||||||
|
bundle.addRequiredAuthorization( ArchivaRoleConstants.OPERATION_MANAGE_CONFIGURATION, Resource.GLOBAL );
|
||||||
|
|
||||||
|
return bundle;
|
||||||
|
}
|
||||||
|
|
||||||
|
public String getSource()
|
||||||
|
{
|
||||||
|
return source;
|
||||||
|
}
|
||||||
|
|
||||||
|
public String getTarget()
|
||||||
|
{
|
||||||
|
return target;
|
||||||
|
}
|
||||||
|
|
||||||
|
public String getWhiteListPattern()
|
||||||
|
{
|
||||||
|
return whiteListPattern;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void initialize()
|
||||||
|
throws InitializationException
|
||||||
|
{
|
||||||
|
policyMap = new HashMap();
|
||||||
|
policyMap.putAll( preDownloadPolicyMap );
|
||||||
|
policyMap.putAll( postDownloadPolicyMap );
|
||||||
|
}
|
||||||
|
|
||||||
|
public String input()
|
||||||
|
{
|
||||||
|
getLogger().info( "input()" );
|
||||||
|
return INPUT;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void prepare()
|
||||||
|
throws Exception
|
||||||
|
{
|
||||||
|
String sourceId = getSource();
|
||||||
|
String targetId = getTarget();
|
||||||
|
|
||||||
|
getLogger().info( ".prepare() - sourceId [" + sourceId + "], targetId [" + targetId + "]" );
|
||||||
|
|
||||||
|
if ( StringUtils.isBlank( sourceId ) || StringUtils.isBlank( targetId ) )
|
||||||
|
{
|
||||||
|
if ( this.connector == null )
|
||||||
|
{
|
||||||
|
getLogger().info( "Creating new connector." );
|
||||||
|
this.connector = new ProxyConnectorConfiguration();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
this.connector = findProxyConnector( sourceId, targetId );
|
||||||
|
}
|
||||||
|
getLogger().info( "Connector: " + connector );
|
||||||
|
|
||||||
|
Configuration config = archivaConfiguration.getConfiguration();
|
||||||
|
|
||||||
|
// Gather Network Proxy Ids.
|
||||||
|
|
||||||
|
this.proxyIdOptions = new ArrayList();
|
||||||
|
this.proxyIdOptions.add( DIRECT_CONNECTION );
|
||||||
|
|
||||||
|
Closure addProxyIds = new Closure()
|
||||||
|
{
|
||||||
|
public void execute( Object input )
|
||||||
|
{
|
||||||
|
if ( input instanceof NetworkProxyConfiguration )
|
||||||
|
{
|
||||||
|
NetworkProxyConfiguration netproxy = (NetworkProxyConfiguration) input;
|
||||||
|
proxyIdOptions.add( netproxy.getId() );
|
||||||
|
}
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
CollectionUtils.forAllDo( config.getNetworkProxies(), addProxyIds );
|
||||||
|
|
||||||
|
// Gather Local & Remote Repo Ids.
|
||||||
|
|
||||||
|
RepositoryIdListClosure remoteRepoIdList = new RepositoryIdListClosure( new ArrayList() );
|
||||||
|
RepositoryIdListClosure localRepoIdList = new RepositoryIdListClosure( new ArrayList() );
|
||||||
|
Closure repoIfClosure = IfClosure.getInstance( RemoteRepositoryPredicate.getInstance(), remoteRepoIdList,
|
||||||
|
localRepoIdList );
|
||||||
|
|
||||||
|
CollectionUtils.forAllDo( config.getRepositories(), repoIfClosure );
|
||||||
|
|
||||||
|
this.remoteRepoIdList = remoteRepoIdList.getList();
|
||||||
|
this.localRepoIdList = localRepoIdList.getList();
|
||||||
|
}
|
||||||
|
|
||||||
|
public String save()
|
||||||
|
{
|
||||||
|
String mode = getMode();
|
||||||
|
|
||||||
|
String sourceId = getConnector().getSourceRepoId();
|
||||||
|
String targetId = getConnector().getTargetRepoId();
|
||||||
|
|
||||||
|
getLogger().info( ".save(" + mode + ":" + sourceId + "->" + targetId + ")" );
|
||||||
|
|
||||||
|
if ( !isValid( getConnector() ) )
|
||||||
|
{
|
||||||
|
return INPUT;
|
||||||
|
}
|
||||||
|
|
||||||
|
if ( StringUtils.equalsIgnoreCase( "edit", mode ) )
|
||||||
|
{
|
||||||
|
removeConnector( sourceId, targetId );
|
||||||
|
}
|
||||||
|
|
||||||
|
try
|
||||||
|
{
|
||||||
|
if ( StringUtils.equals( DIRECT_CONNECTION, getConnector().getProxyId() ) )
|
||||||
|
{
|
||||||
|
getConnector().setProxyId( null );
|
||||||
|
}
|
||||||
|
|
||||||
|
addProxyConnector( getConnector() );
|
||||||
|
saveConfiguration();
|
||||||
|
}
|
||||||
|
catch ( IOException e )
|
||||||
|
{
|
||||||
|
addActionError( "I/O Exception: " + e.getMessage() );
|
||||||
|
}
|
||||||
|
catch ( InvalidConfigurationException e )
|
||||||
|
{
|
||||||
|
addActionError( "Invalid Configuration Exception: " + e.getMessage() );
|
||||||
|
}
|
||||||
|
catch ( RegistryException e )
|
||||||
|
{
|
||||||
|
addActionError( "Configuration Registry Exception: " + e.getMessage() );
|
||||||
|
}
|
||||||
|
|
||||||
|
return SUCCESS;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setBlackListPattern( String blackListPattern )
|
||||||
|
{
|
||||||
|
this.blackListPattern = blackListPattern;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setConnector( ProxyConnectorConfiguration connector )
|
||||||
|
{
|
||||||
|
this.connector = connector;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setLocalRepoIdList( List localRepoIdList )
|
||||||
|
{
|
||||||
|
this.localRepoIdList = localRepoIdList;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setMode( String mode )
|
||||||
|
{
|
||||||
|
this.mode = mode;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setPropertyKey( String propertyKey )
|
||||||
|
{
|
||||||
|
this.propertyKey = propertyKey;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setPropertyValue( String propertyValue )
|
||||||
|
{
|
||||||
|
this.propertyValue = propertyValue;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setRemoteRepoIdList( List remoteRepoIdList )
|
||||||
|
{
|
||||||
|
this.remoteRepoIdList = remoteRepoIdList;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setSource( String source )
|
||||||
|
{
|
||||||
|
this.source = source;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setTarget( String target )
|
||||||
|
{
|
||||||
|
this.target = target;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setWhiteListPattern( String whiteListPattern )
|
||||||
|
{
|
||||||
|
this.whiteListPattern = whiteListPattern;
|
||||||
|
}
|
||||||
|
|
||||||
|
private void addProxyConnector( ProxyConnectorConfiguration proxyConnector )
|
||||||
|
throws IOException
|
||||||
|
{
|
||||||
|
archivaConfiguration.getConfiguration().addProxyConnector( proxyConnector );
|
||||||
|
}
|
||||||
|
|
||||||
|
private ProxyConnectorConfiguration findProxyConnector( String sourceId, String targetId )
|
||||||
|
{
|
||||||
|
Configuration config = archivaConfiguration.getConfiguration();
|
||||||
|
|
||||||
|
ProxyConnectorSelectionPredicate selectedProxy = new ProxyConnectorSelectionPredicate( sourceId, targetId );
|
||||||
|
return (ProxyConnectorConfiguration) CollectionUtils.find( config.getProxyConnectors(), selectedProxy );
|
||||||
|
}
|
||||||
|
|
||||||
|
private boolean isValid( ProxyConnectorConfiguration proxyConnector )
|
||||||
|
{
|
||||||
|
if ( proxyConnector.getPolicies() == null )
|
||||||
|
{
|
||||||
|
addActionError( "Policies must be set." );
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
Iterator it = policyMap.entrySet().iterator();
|
||||||
|
while ( it.hasNext() )
|
||||||
|
{
|
||||||
|
Map.Entry entry = (Entry) it.next();
|
||||||
|
String policyId = (String) entry.getKey();
|
||||||
|
DownloadPolicy policy = (DownloadPolicy) entry.getValue();
|
||||||
|
List options = policy.getOptions();
|
||||||
|
|
||||||
|
if ( !proxyConnector.getPolicies().containsKey( policyId ) )
|
||||||
|
{
|
||||||
|
addActionError( "Policy [" + policyId + "] must be set (missing id)." );
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
String arr[] = (String[]) proxyConnector.getPolicies().get( policyId );
|
||||||
|
String value = arr[0];
|
||||||
|
|
||||||
|
proxyConnector.getPolicies().put( policyId, value );
|
||||||
|
|
||||||
|
if ( StringUtils.isBlank( value ) )
|
||||||
|
{
|
||||||
|
addActionError( "Policy [" + policyId + "] must be set (missing value)." );
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
if ( !options.contains( value ) )
|
||||||
|
{
|
||||||
|
addActionError( "Value of [" + value + "] is invalid for policy [" + policyId + "], valid values: "
|
||||||
|
+ options );
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if ( hasActionErrors() || hasActionMessages() )
|
||||||
|
{
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
private void removeConnector( String sourceId, String targetId )
|
||||||
|
{
|
||||||
|
ProxyConnectorSelectionPredicate selectedProxy = new ProxyConnectorSelectionPredicate( sourceId, targetId );
|
||||||
|
NotPredicate notSelectedProxy = new NotPredicate( selectedProxy );
|
||||||
|
CollectionUtils.filter( archivaConfiguration.getConfiguration().getProxyConnectors(), notSelectedProxy );
|
||||||
|
}
|
||||||
|
|
||||||
|
private String saveConfiguration()
|
||||||
|
throws IOException, InvalidConfigurationException, RegistryException
|
||||||
|
{
|
||||||
|
archivaConfiguration.save( archivaConfiguration.getConfiguration() );
|
||||||
|
|
||||||
|
addActionMessage( "Successfully saved configuration" );
|
||||||
|
|
||||||
|
return SUCCESS;
|
||||||
|
}
|
||||||
|
|
||||||
|
public String getPattern()
|
||||||
|
{
|
||||||
|
return pattern;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setPattern( String pattern )
|
||||||
|
{
|
||||||
|
this.pattern = pattern;
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,151 @@
|
||||||
|
package org.apache.maven.archiva.web.action.admin.connectors.proxy;
|
||||||
|
|
||||||
|
/*
|
||||||
|
* 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.
|
||||||
|
*/
|
||||||
|
|
||||||
|
import com.opensymphony.xwork.Preparable;
|
||||||
|
|
||||||
|
import org.apache.commons.collections.Closure;
|
||||||
|
import org.apache.commons.collections.CollectionUtils;
|
||||||
|
import org.apache.commons.collections.Transformer;
|
||||||
|
import org.apache.maven.archiva.configuration.ArchivaConfiguration;
|
||||||
|
import org.apache.maven.archiva.configuration.Configuration;
|
||||||
|
import org.apache.maven.archiva.configuration.ProxyConnectorConfiguration;
|
||||||
|
import org.apache.maven.archiva.configuration.RepositoryConfiguration;
|
||||||
|
import org.apache.maven.archiva.security.ArchivaRoleConstants;
|
||||||
|
import org.apache.maven.archiva.web.action.admin.repositories.AdminRepositoryConfiguration;
|
||||||
|
import org.codehaus.plexus.security.rbac.Resource;
|
||||||
|
import org.codehaus.plexus.security.ui.web.interceptor.SecureAction;
|
||||||
|
import org.codehaus.plexus.security.ui.web.interceptor.SecureActionBundle;
|
||||||
|
import org.codehaus.plexus.security.ui.web.interceptor.SecureActionException;
|
||||||
|
import org.codehaus.plexus.xwork.action.PlexusActionSupport;
|
||||||
|
|
||||||
|
import java.util.ArrayList;
|
||||||
|
import java.util.HashMap;
|
||||||
|
import java.util.List;
|
||||||
|
import java.util.Map;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* ProxyConnectorsAction
|
||||||
|
*
|
||||||
|
* @author <a href="mailto:joakim@erdfelt.com">Joakim Erdfelt</a>
|
||||||
|
* @version $Id$
|
||||||
|
*
|
||||||
|
* @plexus.component role="com.opensymphony.xwork.Action" role-hint="proxyConnectorsAction"
|
||||||
|
*/
|
||||||
|
public class ProxyConnectorsAction
|
||||||
|
extends PlexusActionSupport
|
||||||
|
implements SecureAction, Preparable
|
||||||
|
{
|
||||||
|
/**
|
||||||
|
* @plexus.requirement role-hint="adminrepoconfig"
|
||||||
|
*/
|
||||||
|
private Transformer repoConfigToAdmin;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @plexus.requirement
|
||||||
|
*/
|
||||||
|
private ArchivaConfiguration archivaConfiguration;
|
||||||
|
|
||||||
|
private Map /*<String,AdminRepositoryConfiguration>*/repoMap;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Map of Proxy Connectors.
|
||||||
|
*/
|
||||||
|
private Map /*<String,AdminProxyConnector>*/proxyConnectorMap;
|
||||||
|
|
||||||
|
public void prepare()
|
||||||
|
throws Exception
|
||||||
|
{
|
||||||
|
Configuration config = archivaConfiguration.getConfiguration();
|
||||||
|
|
||||||
|
repoMap = new HashMap();
|
||||||
|
|
||||||
|
Closure addToRepoMap = new Closure()
|
||||||
|
{
|
||||||
|
public void execute( Object input )
|
||||||
|
{
|
||||||
|
if ( input instanceof RepositoryConfiguration )
|
||||||
|
{
|
||||||
|
AdminRepositoryConfiguration arepo = (AdminRepositoryConfiguration) repoConfigToAdmin
|
||||||
|
.transform( input );
|
||||||
|
repoMap.put( arepo.getId(), arepo );
|
||||||
|
}
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
CollectionUtils.forAllDo( config.getRepositories(), addToRepoMap );
|
||||||
|
|
||||||
|
proxyConnectorMap = new HashMap();
|
||||||
|
|
||||||
|
Closure addToProxyConnectorMap = new Closure()
|
||||||
|
{
|
||||||
|
public void execute( Object input )
|
||||||
|
{
|
||||||
|
if ( input instanceof ProxyConnectorConfiguration )
|
||||||
|
{
|
||||||
|
ProxyConnectorConfiguration proxyConfig = (ProxyConnectorConfiguration) input;
|
||||||
|
String key = proxyConfig.getSourceRepoId();
|
||||||
|
|
||||||
|
List connectors = (List) proxyConnectorMap.get( key );
|
||||||
|
if ( connectors == null )
|
||||||
|
{
|
||||||
|
connectors = new ArrayList();
|
||||||
|
proxyConnectorMap.put( key, connectors );
|
||||||
|
}
|
||||||
|
|
||||||
|
connectors.add( proxyConfig );
|
||||||
|
}
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
CollectionUtils.forAllDo( config.getProxyConnectors(), addToProxyConnectorMap );
|
||||||
|
}
|
||||||
|
|
||||||
|
public SecureActionBundle getSecureActionBundle()
|
||||||
|
throws SecureActionException
|
||||||
|
{
|
||||||
|
SecureActionBundle bundle = new SecureActionBundle();
|
||||||
|
|
||||||
|
bundle.setRequiresAuthentication( true );
|
||||||
|
bundle.addRequiredAuthorization( ArchivaRoleConstants.OPERATION_MANAGE_CONFIGURATION, Resource.GLOBAL );
|
||||||
|
|
||||||
|
return bundle;
|
||||||
|
}
|
||||||
|
|
||||||
|
public Map getRepoMap()
|
||||||
|
{
|
||||||
|
return repoMap;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setRepoMap( Map repoMap )
|
||||||
|
{
|
||||||
|
this.repoMap = repoMap;
|
||||||
|
}
|
||||||
|
|
||||||
|
public Map getProxyConnectorMap()
|
||||||
|
{
|
||||||
|
return proxyConnectorMap;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setProxyConnectorMap( Map proxyConnectorMap )
|
||||||
|
{
|
||||||
|
this.proxyConnectorMap = proxyConnectorMap;
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,56 @@
|
||||||
|
package org.apache.maven.archiva.web.action.admin.connectors.proxy;
|
||||||
|
|
||||||
|
/*
|
||||||
|
* 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.
|
||||||
|
*/
|
||||||
|
|
||||||
|
import org.apache.commons.collections.Transformer;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Ensure that input strings are never arrays.
|
||||||
|
*
|
||||||
|
* @author <a href="mailto:joakim@erdfelt.com">Joakim Erdfelt</a>
|
||||||
|
* @version $Id$
|
||||||
|
*/
|
||||||
|
public class SingleSelectTransformer
|
||||||
|
implements Transformer
|
||||||
|
{
|
||||||
|
private static Transformer INSTANCE = new SingleSelectTransformer();
|
||||||
|
|
||||||
|
public Object transform( Object input )
|
||||||
|
{
|
||||||
|
if ( input instanceof String )
|
||||||
|
{
|
||||||
|
if ( input.getClass().isArray() )
|
||||||
|
{
|
||||||
|
String arr[] = (String[]) input;
|
||||||
|
if ( arr.length > 0 )
|
||||||
|
{
|
||||||
|
return arr[0];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
public static Transformer getInstance()
|
||||||
|
{
|
||||||
|
return INSTANCE;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
|
@ -0,0 +1,73 @@
|
||||||
|
package org.apache.maven.archiva.web.action.admin.database;
|
||||||
|
|
||||||
|
/*
|
||||||
|
* 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.
|
||||||
|
*/
|
||||||
|
|
||||||
|
import com.opensymphony.webwork.interceptor.ServletRequestAware;
|
||||||
|
import com.opensymphony.xwork.ModelDriven;
|
||||||
|
import com.opensymphony.xwork.Preparable;
|
||||||
|
import com.opensymphony.xwork.Validateable;
|
||||||
|
|
||||||
|
import org.codehaus.plexus.security.ui.web.interceptor.SecureAction;
|
||||||
|
import org.codehaus.plexus.security.ui.web.interceptor.SecureActionBundle;
|
||||||
|
import org.codehaus.plexus.security.ui.web.interceptor.SecureActionException;
|
||||||
|
import org.codehaus.plexus.xwork.action.PlexusActionSupport;
|
||||||
|
|
||||||
|
import javax.servlet.http.HttpServletRequest;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* DatabaseAction
|
||||||
|
*
|
||||||
|
* @author <a href="mailto:joakim@erdfelt.com">Joakim Erdfelt</a>
|
||||||
|
* @version $Id$
|
||||||
|
*
|
||||||
|
* @plexus.component role="com.opensymphony.xwork.Action" role-hint="databaseAction"
|
||||||
|
*/
|
||||||
|
public class DatabaseAction
|
||||||
|
extends PlexusActionSupport
|
||||||
|
implements ModelDriven, Preparable, Validateable, SecureAction, ServletRequestAware
|
||||||
|
{
|
||||||
|
|
||||||
|
public Object getModel()
|
||||||
|
{
|
||||||
|
// TODO Auto-generated method stub
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void prepare()
|
||||||
|
throws Exception
|
||||||
|
{
|
||||||
|
// TODO Auto-generated method stub
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
public SecureActionBundle getSecureActionBundle()
|
||||||
|
throws SecureActionException
|
||||||
|
{
|
||||||
|
// TODO Auto-generated method stub
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setServletRequest( HttpServletRequest request )
|
||||||
|
{
|
||||||
|
// TODO Auto-generated method stub
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
|
@ -1,110 +0,0 @@
|
||||||
package org.apache.maven.archiva.web.action.admin.models;
|
|
||||||
|
|
||||||
/*
|
|
||||||
* 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.
|
|
||||||
*/
|
|
||||||
|
|
||||||
import org.apache.maven.archiva.configuration.Configuration;
|
|
||||||
import org.apache.maven.archiva.configuration.RepositoryConfiguration;
|
|
||||||
|
|
||||||
import java.util.ArrayList;
|
|
||||||
import java.util.HashMap;
|
|
||||||
import java.util.Iterator;
|
|
||||||
import java.util.List;
|
|
||||||
import java.util.Map;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* AdminModel
|
|
||||||
*
|
|
||||||
* @author <a href="mailto:joakim@erdfelt.com">Joakim Erdfelt</a>
|
|
||||||
* @version $Id$
|
|
||||||
*/
|
|
||||||
public class AdminModel
|
|
||||||
{
|
|
||||||
private String baseUrl;
|
|
||||||
|
|
||||||
private List managedRepositories = new ArrayList();
|
|
||||||
|
|
||||||
private List remoteRepositories = new ArrayList();
|
|
||||||
|
|
||||||
private Map repoMap = new HashMap();
|
|
||||||
|
|
||||||
public AdminModel()
|
|
||||||
{
|
|
||||||
/* do nothing */
|
|
||||||
}
|
|
||||||
|
|
||||||
public AdminModel( Configuration configuration )
|
|
||||||
{
|
|
||||||
repoMap.putAll( configuration.createRepositoryMap() );
|
|
||||||
|
|
||||||
Iterator it = configuration.getRepositories().iterator();
|
|
||||||
while ( it.hasNext() )
|
|
||||||
{
|
|
||||||
RepositoryConfiguration repoconfig = (RepositoryConfiguration) it.next();
|
|
||||||
if ( repoconfig.isManaged() )
|
|
||||||
{
|
|
||||||
managedRepositories.add( new AdminRepositoryConfiguration( repoconfig ) );
|
|
||||||
}
|
|
||||||
else if ( repoconfig.isRemote() )
|
|
||||||
{
|
|
||||||
remoteRepositories.add( repoconfig );
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
// Should never occur, but it is possible that the configuration could
|
|
||||||
// contain a repository configuration which is null.
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
public List getManagedRepositories()
|
|
||||||
{
|
|
||||||
return managedRepositories;
|
|
||||||
}
|
|
||||||
|
|
||||||
public void setManagedRepositories( List managedRepositories )
|
|
||||||
{
|
|
||||||
this.managedRepositories = managedRepositories;
|
|
||||||
}
|
|
||||||
|
|
||||||
public List getRemoteRepositories()
|
|
||||||
{
|
|
||||||
return remoteRepositories;
|
|
||||||
}
|
|
||||||
|
|
||||||
public void setRemoteRepositories( List remoteRepositories )
|
|
||||||
{
|
|
||||||
this.remoteRepositories = remoteRepositories;
|
|
||||||
}
|
|
||||||
|
|
||||||
public String getBaseUrl()
|
|
||||||
{
|
|
||||||
return baseUrl;
|
|
||||||
}
|
|
||||||
|
|
||||||
public void setBaseUrl( String baseUrl )
|
|
||||||
{
|
|
||||||
this.baseUrl = baseUrl;
|
|
||||||
}
|
|
||||||
|
|
||||||
public String toString()
|
|
||||||
{
|
|
||||||
return "[ActionModel]";
|
|
||||||
}
|
|
||||||
}
|
|
|
@ -0,0 +1,73 @@
|
||||||
|
package org.apache.maven.archiva.web.action.admin.networkproxies;
|
||||||
|
|
||||||
|
/*
|
||||||
|
* 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.
|
||||||
|
*/
|
||||||
|
|
||||||
|
import com.opensymphony.webwork.interceptor.ServletRequestAware;
|
||||||
|
import com.opensymphony.xwork.ModelDriven;
|
||||||
|
import com.opensymphony.xwork.Preparable;
|
||||||
|
import com.opensymphony.xwork.Validateable;
|
||||||
|
|
||||||
|
import org.codehaus.plexus.security.ui.web.interceptor.SecureAction;
|
||||||
|
import org.codehaus.plexus.security.ui.web.interceptor.SecureActionBundle;
|
||||||
|
import org.codehaus.plexus.security.ui.web.interceptor.SecureActionException;
|
||||||
|
import org.codehaus.plexus.xwork.action.PlexusActionSupport;
|
||||||
|
|
||||||
|
import javax.servlet.http.HttpServletRequest;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* NetworkProxiesAction
|
||||||
|
*
|
||||||
|
* @author <a href="mailto:joakim@erdfelt.com">Joakim Erdfelt</a>
|
||||||
|
* @version $Id$
|
||||||
|
*
|
||||||
|
* @plexus.component role="com.opensymphony.xwork.Action" role-hint="networkProxiesAction"
|
||||||
|
*/
|
||||||
|
public class NetworkProxiesAction
|
||||||
|
extends PlexusActionSupport
|
||||||
|
implements ModelDriven, Preparable, Validateable, SecureAction, ServletRequestAware
|
||||||
|
{
|
||||||
|
|
||||||
|
public Object getModel()
|
||||||
|
{
|
||||||
|
// TODO Auto-generated method stub
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void prepare()
|
||||||
|
throws Exception
|
||||||
|
{
|
||||||
|
// TODO Auto-generated method stub
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
public SecureActionBundle getSecureActionBundle()
|
||||||
|
throws SecureActionException
|
||||||
|
{
|
||||||
|
// TODO Auto-generated method stub
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setServletRequest( HttpServletRequest request )
|
||||||
|
{
|
||||||
|
// TODO Auto-generated method stub
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
|
@ -1,4 +1,4 @@
|
||||||
package org.apache.maven.archiva.web.action.admin.models;
|
package org.apache.maven.archiva.web.action.admin.repositories;
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Licensed to the Apache Software Foundation (ASF) under one
|
* Licensed to the Apache Software Foundation (ASF) under one
|
||||||
|
@ -36,8 +36,6 @@ import java.io.File;
|
||||||
public class AdminRepositoryConfiguration
|
public class AdminRepositoryConfiguration
|
||||||
extends RepositoryConfiguration
|
extends RepositoryConfiguration
|
||||||
{
|
{
|
||||||
private String directory;
|
|
||||||
|
|
||||||
private RepositoryContentStatistics stats;
|
private RepositoryContentStatistics stats;
|
||||||
|
|
||||||
public AdminRepositoryConfiguration()
|
public AdminRepositoryConfiguration()
|
||||||
|
@ -70,23 +68,33 @@ public class AdminRepositoryConfiguration
|
||||||
|
|
||||||
public boolean isDirectoryExists()
|
public boolean isDirectoryExists()
|
||||||
{
|
{
|
||||||
if ( StringUtils.isBlank( directory ) )
|
if ( StringUtils.isBlank( getDirectory() ) )
|
||||||
{
|
{
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
File dir = new File( directory );
|
File dir = new File( getDirectory() );
|
||||||
return ( dir.exists() && dir.isDirectory() );
|
return ( dir.exists() && dir.isDirectory() );
|
||||||
}
|
}
|
||||||
|
|
||||||
public String getDirectory()
|
public String getDirectory()
|
||||||
{
|
{
|
||||||
return directory;
|
if ( this.isManaged() )
|
||||||
|
{
|
||||||
|
if ( StringUtils.isBlank( this.getUrl() ) )
|
||||||
|
{
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
RepositoryURL url = new RepositoryURL( this.getUrl() );
|
||||||
|
return url.getPath();
|
||||||
|
}
|
||||||
|
|
||||||
|
return null;
|
||||||
}
|
}
|
||||||
|
|
||||||
public void setDirectory( String directory )
|
public void setDirectory( String directory )
|
||||||
{
|
{
|
||||||
this.directory = directory;
|
|
||||||
this.setUrl( PathUtil.toUrl( directory ) );
|
this.setUrl( PathUtil.toUrl( directory ) );
|
||||||
}
|
}
|
||||||
|
|
|
@ -0,0 +1,370 @@
|
||||||
|
package org.apache.maven.archiva.web.action.admin.repositories;
|
||||||
|
|
||||||
|
/*
|
||||||
|
* 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.
|
||||||
|
*/
|
||||||
|
|
||||||
|
import com.opensymphony.xwork.ActionContext;
|
||||||
|
import com.opensymphony.xwork.Preparable;
|
||||||
|
|
||||||
|
import org.apache.commons.io.FileUtils;
|
||||||
|
import org.apache.commons.lang.StringUtils;
|
||||||
|
import org.apache.maven.archiva.common.utils.PathUtil;
|
||||||
|
import org.apache.maven.archiva.configuration.ArchivaConfiguration;
|
||||||
|
import org.apache.maven.archiva.configuration.InvalidConfigurationException;
|
||||||
|
import org.apache.maven.archiva.configuration.RepositoryConfiguration;
|
||||||
|
import org.apache.maven.archiva.security.ArchivaRoleConstants;
|
||||||
|
import org.codehaus.plexus.rbac.profile.RoleProfileException;
|
||||||
|
import org.codehaus.plexus.rbac.profile.RoleProfileManager;
|
||||||
|
import org.codehaus.plexus.registry.RegistryException;
|
||||||
|
import org.codehaus.plexus.security.authorization.AuthorizationException;
|
||||||
|
import org.codehaus.plexus.security.authorization.AuthorizationResult;
|
||||||
|
import org.codehaus.plexus.security.rbac.RbacManagerException;
|
||||||
|
import org.codehaus.plexus.security.rbac.Resource;
|
||||||
|
import org.codehaus.plexus.security.system.SecuritySession;
|
||||||
|
import org.codehaus.plexus.security.system.SecuritySystem;
|
||||||
|
import org.codehaus.plexus.security.ui.web.interceptor.SecureAction;
|
||||||
|
import org.codehaus.plexus.security.ui.web.interceptor.SecureActionBundle;
|
||||||
|
import org.codehaus.plexus.security.ui.web.interceptor.SecureActionException;
|
||||||
|
import org.codehaus.plexus.xwork.action.PlexusActionSupport;
|
||||||
|
|
||||||
|
import java.io.File;
|
||||||
|
import java.io.IOException;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Configures the application repositories.
|
||||||
|
*
|
||||||
|
* @plexus.component role="com.opensymphony.xwork.Action" role-hint="configureRepositoryAction"
|
||||||
|
*/
|
||||||
|
public class ConfigureRepositoryAction
|
||||||
|
extends PlexusActionSupport
|
||||||
|
implements Preparable, SecureAction
|
||||||
|
{
|
||||||
|
/**
|
||||||
|
* @plexus.requirement role-hint="archiva"
|
||||||
|
*/
|
||||||
|
private RoleProfileManager roleProfileManager;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @plexus.requirement
|
||||||
|
*/
|
||||||
|
private SecuritySystem securitySystem;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @plexus.requirement
|
||||||
|
*/
|
||||||
|
private ArchivaConfiguration archivaConfiguration;
|
||||||
|
|
||||||
|
private String repoid;
|
||||||
|
|
||||||
|
private String mode;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* The model for this action.
|
||||||
|
*/
|
||||||
|
private AdminRepositoryConfiguration repository;
|
||||||
|
|
||||||
|
public String add()
|
||||||
|
{
|
||||||
|
getLogger().info( ".add()" );
|
||||||
|
this.mode = "add";
|
||||||
|
|
||||||
|
return INPUT;
|
||||||
|
}
|
||||||
|
|
||||||
|
public String confirm()
|
||||||
|
{
|
||||||
|
getLogger().info( ".confirm()" );
|
||||||
|
|
||||||
|
if ( operationAllowed( ArchivaRoleConstants.OPERATION_DELETE_REPOSITORY, getRepoid() ) )
|
||||||
|
{
|
||||||
|
addActionError( "You do not have the appropriate permissions to delete the " + getRepoid() + " repository." );
|
||||||
|
return ERROR;
|
||||||
|
}
|
||||||
|
|
||||||
|
return INPUT;
|
||||||
|
}
|
||||||
|
|
||||||
|
public String delete()
|
||||||
|
{
|
||||||
|
getLogger().info( ".delete()" );
|
||||||
|
|
||||||
|
if ( operationAllowed( ArchivaRoleConstants.OPERATION_DELETE_REPOSITORY, getRepoid() ) )
|
||||||
|
{
|
||||||
|
addActionError( "You do not have the appropriate permissions to delete the " + getRepoid() + " repository." );
|
||||||
|
return ERROR;
|
||||||
|
}
|
||||||
|
|
||||||
|
if ( StringUtils.equals( mode, "delete-entry" ) || StringUtils.equals( mode, "delete-contents" ) )
|
||||||
|
{
|
||||||
|
AdminRepositoryConfiguration existingRepository = getRepository();
|
||||||
|
if ( existingRepository == null )
|
||||||
|
{
|
||||||
|
addActionError( "A repository with that id does not exist" );
|
||||||
|
return ERROR;
|
||||||
|
}
|
||||||
|
|
||||||
|
// TODO: remove from index too!
|
||||||
|
|
||||||
|
try
|
||||||
|
{
|
||||||
|
removeRepository( getRepoid() );
|
||||||
|
removeRepositoryRoles( existingRepository );
|
||||||
|
saveConfiguration();
|
||||||
|
|
||||||
|
if ( StringUtils.equals( mode, "delete-contents" ) )
|
||||||
|
{
|
||||||
|
removeContents( existingRepository );
|
||||||
|
}
|
||||||
|
}
|
||||||
|
catch ( IOException e )
|
||||||
|
{
|
||||||
|
addActionError( "Unable to delete repository: " + e.getMessage() );
|
||||||
|
}
|
||||||
|
catch ( RoleProfileException e )
|
||||||
|
{
|
||||||
|
addActionError( "Unable to delete repository: " + e.getMessage() );
|
||||||
|
}
|
||||||
|
catch ( InvalidConfigurationException e )
|
||||||
|
{
|
||||||
|
addActionError( "Unable to delete repository: " + e.getMessage() );
|
||||||
|
}
|
||||||
|
catch ( RbacManagerException e )
|
||||||
|
{
|
||||||
|
addActionError( "Unable to delete repository: " + e.getMessage() );
|
||||||
|
}
|
||||||
|
catch ( RegistryException e )
|
||||||
|
{
|
||||||
|
addActionError( "Unable to delete repository: " + e.getMessage() );
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return SUCCESS;
|
||||||
|
}
|
||||||
|
|
||||||
|
public String edit()
|
||||||
|
{
|
||||||
|
getLogger().info( ".edit()" );
|
||||||
|
this.mode = "edit";
|
||||||
|
|
||||||
|
if ( operationAllowed( ArchivaRoleConstants.OPERATION_EDIT_REPOSITORY, getRepoid() ) )
|
||||||
|
{
|
||||||
|
addActionError( "You do not have the appropriate permissions to edit the " + getRepoid() + " repository." );
|
||||||
|
return ERROR;
|
||||||
|
}
|
||||||
|
|
||||||
|
return INPUT;
|
||||||
|
}
|
||||||
|
|
||||||
|
public String getMode()
|
||||||
|
{
|
||||||
|
return this.mode;
|
||||||
|
}
|
||||||
|
|
||||||
|
public String getRepoid()
|
||||||
|
{
|
||||||
|
return repoid;
|
||||||
|
}
|
||||||
|
|
||||||
|
public AdminRepositoryConfiguration getRepository()
|
||||||
|
{
|
||||||
|
return repository;
|
||||||
|
}
|
||||||
|
|
||||||
|
public SecureActionBundle getSecureActionBundle()
|
||||||
|
throws SecureActionException
|
||||||
|
{
|
||||||
|
SecureActionBundle bundle = new SecureActionBundle();
|
||||||
|
|
||||||
|
bundle.setRequiresAuthentication( true );
|
||||||
|
bundle.addRequiredAuthorization( ArchivaRoleConstants.OPERATION_MANAGE_CONFIGURATION, Resource.GLOBAL );
|
||||||
|
|
||||||
|
return bundle;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void prepare()
|
||||||
|
throws Exception
|
||||||
|
{
|
||||||
|
String id = getRepoid();
|
||||||
|
if ( id == null )
|
||||||
|
{
|
||||||
|
this.repository = new AdminRepositoryConfiguration();
|
||||||
|
}
|
||||||
|
|
||||||
|
RepositoryConfiguration repoconfig = archivaConfiguration.getConfiguration().findRepositoryById( id );
|
||||||
|
if ( repoconfig != null )
|
||||||
|
{
|
||||||
|
this.repository = new AdminRepositoryConfiguration( repoconfig );
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public String save()
|
||||||
|
{
|
||||||
|
String mode = getMode();
|
||||||
|
String repoId = getRepository().getId();
|
||||||
|
|
||||||
|
getLogger().info( ".save(" + mode + ":" + repoId + ")" );
|
||||||
|
|
||||||
|
if ( StringUtils.isBlank( repository.getId() ) )
|
||||||
|
{
|
||||||
|
addFieldError( "id", "A repository with a blank id cannot be saved." );
|
||||||
|
return SUCCESS;
|
||||||
|
}
|
||||||
|
|
||||||
|
if ( StringUtils.equalsIgnoreCase( "edit", mode ) )
|
||||||
|
{
|
||||||
|
removeRepository( repoId );
|
||||||
|
}
|
||||||
|
|
||||||
|
try
|
||||||
|
{
|
||||||
|
addRepository( getRepository() );
|
||||||
|
saveConfiguration();
|
||||||
|
}
|
||||||
|
catch ( IOException e )
|
||||||
|
{
|
||||||
|
addActionError( "I/O Exception: " + e.getMessage() );
|
||||||
|
}
|
||||||
|
catch ( RoleProfileException e )
|
||||||
|
{
|
||||||
|
addActionError( "Role Profile Exception: " + e.getMessage() );
|
||||||
|
}
|
||||||
|
catch ( InvalidConfigurationException e )
|
||||||
|
{
|
||||||
|
addActionError( "Invalid Configuration Exception: " + e.getMessage() );
|
||||||
|
}
|
||||||
|
catch ( RbacManagerException e )
|
||||||
|
{
|
||||||
|
addActionError( "RBAC Manager Exception: " + e.getMessage() );
|
||||||
|
}
|
||||||
|
catch ( RegistryException e )
|
||||||
|
{
|
||||||
|
addActionError( "Configuration Registry Exception: " + e.getMessage() );
|
||||||
|
}
|
||||||
|
|
||||||
|
return SUCCESS;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setMode( String mode )
|
||||||
|
{
|
||||||
|
this.mode = mode;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setRepoid( String repoid )
|
||||||
|
{
|
||||||
|
this.repoid = repoid;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setRepository( AdminRepositoryConfiguration repository )
|
||||||
|
{
|
||||||
|
this.repository = repository;
|
||||||
|
}
|
||||||
|
|
||||||
|
private void addRepository( AdminRepositoryConfiguration repository )
|
||||||
|
throws IOException, RoleProfileException
|
||||||
|
{
|
||||||
|
getLogger().info( ".addRepository(" + repository + ")" );
|
||||||
|
|
||||||
|
// Fix the URL entry (could possibly be a filesystem path)
|
||||||
|
String rawUrlEntry = repository.getUrl();
|
||||||
|
repository.setUrl( PathUtil.toUrl( rawUrlEntry ) );
|
||||||
|
|
||||||
|
if ( repository.isManaged() )
|
||||||
|
{
|
||||||
|
// Normalize the path
|
||||||
|
File file = new File( repository.getDirectory() );
|
||||||
|
repository.setDirectory( file.getCanonicalPath() );
|
||||||
|
if ( !file.exists() )
|
||||||
|
{
|
||||||
|
file.mkdirs();
|
||||||
|
// TODO: error handling when this fails, or is not a directory!
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
archivaConfiguration.getConfiguration().addRepository( repository );
|
||||||
|
|
||||||
|
// TODO: double check these are configured on start up
|
||||||
|
roleProfileManager.getDynamicRole( "archiva-repository-manager", repository.getId() );
|
||||||
|
|
||||||
|
roleProfileManager.getDynamicRole( "archiva-repository-observer", repository.getId() );
|
||||||
|
}
|
||||||
|
|
||||||
|
private boolean operationAllowed( String permission, String repoid )
|
||||||
|
{
|
||||||
|
ActionContext context = ActionContext.getContext();
|
||||||
|
SecuritySession securitySession = (SecuritySession) context.get( SecuritySession.ROLE );
|
||||||
|
|
||||||
|
AuthorizationResult authzResult;
|
||||||
|
try
|
||||||
|
{
|
||||||
|
authzResult = securitySystem.authorize( securitySession, permission, repoid );
|
||||||
|
|
||||||
|
return authzResult.isAuthorized();
|
||||||
|
}
|
||||||
|
catch ( AuthorizationException e )
|
||||||
|
{
|
||||||
|
getLogger().info(
|
||||||
|
"Unable to authorize permission: " + permission + " against repo: " + repoid
|
||||||
|
+ " due to: " + e.getMessage() );
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private void removeContents( AdminRepositoryConfiguration existingRepository )
|
||||||
|
throws IOException
|
||||||
|
{
|
||||||
|
if ( existingRepository.isManaged() )
|
||||||
|
{
|
||||||
|
getLogger().info( "Removing " + existingRepository.getDirectory() );
|
||||||
|
FileUtils.deleteDirectory( new File( existingRepository.getDirectory() ) );
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private void removeRepository( String repoId )
|
||||||
|
{
|
||||||
|
getLogger().info( ".removeRepository()" );
|
||||||
|
|
||||||
|
RepositoryConfiguration toremove = archivaConfiguration.getConfiguration().findRepositoryById( repoId );
|
||||||
|
if ( toremove != null )
|
||||||
|
{
|
||||||
|
archivaConfiguration.getConfiguration().removeRepository( toremove );
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private void removeRepositoryRoles( RepositoryConfiguration existingRepository )
|
||||||
|
throws RoleProfileException
|
||||||
|
{
|
||||||
|
roleProfileManager.deleteDynamicRole( "archiva-repository-manager", existingRepository.getId() );
|
||||||
|
roleProfileManager.deleteDynamicRole( "archiva-repository-observer", existingRepository.getId() );
|
||||||
|
|
||||||
|
getLogger().info( "removed user roles associated with repository " + existingRepository.getId() );
|
||||||
|
}
|
||||||
|
|
||||||
|
private String saveConfiguration()
|
||||||
|
throws IOException, InvalidConfigurationException, RbacManagerException, RoleProfileException,
|
||||||
|
RegistryException
|
||||||
|
{
|
||||||
|
getLogger().info( ".saveConfiguration()" );
|
||||||
|
|
||||||
|
archivaConfiguration.save( archivaConfiguration.getConfiguration() );
|
||||||
|
|
||||||
|
addActionMessage( "Successfully saved configuration" );
|
||||||
|
|
||||||
|
return SUCCESS;
|
||||||
|
}
|
||||||
|
}
|
|
@ -1,4 +1,4 @@
|
||||||
package org.apache.maven.archiva.web.action.admin;
|
package org.apache.maven.archiva.web.action.admin.repositories;
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Licensed to the Apache Software Foundation (ASF) under one
|
* Licensed to the Apache Software Foundation (ASF) under one
|
||||||
|
@ -20,17 +20,17 @@ package org.apache.maven.archiva.web.action.admin;
|
||||||
*/
|
*/
|
||||||
|
|
||||||
import com.opensymphony.webwork.interceptor.ServletRequestAware;
|
import com.opensymphony.webwork.interceptor.ServletRequestAware;
|
||||||
import com.opensymphony.xwork.ModelDriven;
|
|
||||||
import com.opensymphony.xwork.Preparable;
|
import com.opensymphony.xwork.Preparable;
|
||||||
import com.opensymphony.xwork.Validateable;
|
|
||||||
|
|
||||||
|
import org.apache.commons.collections.CollectionUtils;
|
||||||
|
import org.apache.commons.collections.Transformer;
|
||||||
|
import org.apache.commons.collections.list.TransformedList;
|
||||||
import org.apache.maven.archiva.configuration.ArchivaConfiguration;
|
import org.apache.maven.archiva.configuration.ArchivaConfiguration;
|
||||||
import org.apache.maven.archiva.database.ArchivaDAO;
|
import org.apache.maven.archiva.configuration.Configuration;
|
||||||
import org.apache.maven.archiva.database.constraints.MostRecentRepositoryScanStatistics;
|
import org.apache.maven.archiva.configuration.util.LocalRepositoryPredicate;
|
||||||
import org.apache.maven.archiva.model.RepositoryContentStatistics;
|
import org.apache.maven.archiva.configuration.util.RemoteRepositoryPredicate;
|
||||||
|
import org.apache.maven.archiva.configuration.util.RepositoryConfigurationComparator;
|
||||||
import org.apache.maven.archiva.security.ArchivaRoleConstants;
|
import org.apache.maven.archiva.security.ArchivaRoleConstants;
|
||||||
import org.apache.maven.archiva.web.action.admin.models.AdminModel;
|
|
||||||
import org.apache.maven.archiva.web.action.admin.models.AdminRepositoryConfiguration;
|
|
||||||
import org.apache.maven.archiva.web.util.ContextUtils;
|
import org.apache.maven.archiva.web.util.ContextUtils;
|
||||||
import org.codehaus.plexus.security.rbac.Resource;
|
import org.codehaus.plexus.security.rbac.Resource;
|
||||||
import org.codehaus.plexus.security.ui.web.interceptor.SecureAction;
|
import org.codehaus.plexus.security.ui.web.interceptor.SecureAction;
|
||||||
|
@ -38,7 +38,8 @@ import org.codehaus.plexus.security.ui.web.interceptor.SecureActionBundle;
|
||||||
import org.codehaus.plexus.security.ui.web.interceptor.SecureActionException;
|
import org.codehaus.plexus.security.ui.web.interceptor.SecureActionException;
|
||||||
import org.codehaus.plexus.xwork.action.PlexusActionSupport;
|
import org.codehaus.plexus.xwork.action.PlexusActionSupport;
|
||||||
|
|
||||||
import java.util.Iterator;
|
import java.util.ArrayList;
|
||||||
|
import java.util.Collections;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
|
|
||||||
import javax.servlet.http.HttpServletRequest;
|
import javax.servlet.http.HttpServletRequest;
|
||||||
|
@ -53,44 +54,27 @@ import javax.servlet.http.HttpServletRequest;
|
||||||
*/
|
*/
|
||||||
public class RepositoriesAction
|
public class RepositoriesAction
|
||||||
extends PlexusActionSupport
|
extends PlexusActionSupport
|
||||||
implements ModelDriven, Preparable, Validateable, SecureAction, ServletRequestAware
|
implements SecureAction, ServletRequestAware, Preparable
|
||||||
{
|
{
|
||||||
/**
|
/**
|
||||||
* @plexus.requirement role-hint="jdo"
|
* @plexus.requirement role-hint="adminrepoconfig"
|
||||||
*/
|
*/
|
||||||
private ArchivaDAO dao;
|
private Transformer repoConfigToAdmin;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @plexus.requirement
|
* @plexus.requirement
|
||||||
*/
|
*/
|
||||||
private ArchivaConfiguration archivaConfiguration;
|
private ArchivaConfiguration archivaConfiguration;
|
||||||
|
|
||||||
private AdminModel model;
|
private List managedRepositories;
|
||||||
|
|
||||||
|
private List remoteRepositories;
|
||||||
|
|
||||||
private String baseUrl;
|
private String baseUrl;
|
||||||
|
|
||||||
public Object getModel()
|
public void setServletRequest( HttpServletRequest request )
|
||||||
{
|
{
|
||||||
return getAdminModel();
|
this.baseUrl = ContextUtils.getBaseURL( request, "repository" );
|
||||||
}
|
|
||||||
|
|
||||||
public void prepare()
|
|
||||||
throws Exception
|
|
||||||
{
|
|
||||||
model = null;
|
|
||||||
getModel();
|
|
||||||
}
|
|
||||||
|
|
||||||
public void validate()
|
|
||||||
{
|
|
||||||
super.validate();
|
|
||||||
}
|
|
||||||
|
|
||||||
public String execute()
|
|
||||||
throws Exception
|
|
||||||
{
|
|
||||||
getLogger().info( ".execute()" );
|
|
||||||
return super.execute();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public SecureActionBundle getSecureActionBundle()
|
public SecureActionBundle getSecureActionBundle()
|
||||||
|
@ -104,46 +88,33 @@ public class RepositoriesAction
|
||||||
return bundle;
|
return bundle;
|
||||||
}
|
}
|
||||||
|
|
||||||
public void setServletRequest( HttpServletRequest request )
|
public void prepare()
|
||||||
|
throws Exception
|
||||||
{
|
{
|
||||||
this.baseUrl = ContextUtils.getBaseURL( request, "repository" );
|
Configuration config = archivaConfiguration.getConfiguration();
|
||||||
|
|
||||||
|
remoteRepositories = TransformedList.decorate( new ArrayList(), repoConfigToAdmin );
|
||||||
|
managedRepositories = TransformedList.decorate( new ArrayList(), repoConfigToAdmin );
|
||||||
|
|
||||||
|
remoteRepositories.addAll( CollectionUtils.select( config.getRepositories(), RemoteRepositoryPredicate.getInstance() ) );
|
||||||
|
managedRepositories.addAll( CollectionUtils.select( config.getRepositories(), LocalRepositoryPredicate.getInstance() ) );
|
||||||
|
|
||||||
|
Collections.sort( managedRepositories, new RepositoryConfigurationComparator() );
|
||||||
|
Collections.sort( remoteRepositories, new RepositoryConfigurationComparator() );
|
||||||
}
|
}
|
||||||
|
|
||||||
public AdminModel getAdminModel()
|
public List getManagedRepositories()
|
||||||
{
|
{
|
||||||
if ( model == null )
|
return managedRepositories;
|
||||||
{
|
|
||||||
model = new AdminModel( archivaConfiguration.getConfiguration() );
|
|
||||||
model.setBaseUrl( baseUrl );
|
|
||||||
updateLastIndexed( model.getManagedRepositories() );
|
|
||||||
}
|
|
||||||
|
|
||||||
return model;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
private void updateLastIndexed( List managedRepositories )
|
public List getRemoteRepositories()
|
||||||
{
|
{
|
||||||
Iterator it = managedRepositories.iterator();
|
return remoteRepositories;
|
||||||
while ( it.hasNext() )
|
|
||||||
{
|
|
||||||
AdminRepositoryConfiguration config = (AdminRepositoryConfiguration) it.next();
|
|
||||||
|
|
||||||
List results = dao.query( new MostRecentRepositoryScanStatistics( config.getId() ) );
|
|
||||||
if ( !results.isEmpty() )
|
|
||||||
{
|
|
||||||
RepositoryContentStatistics stats = (RepositoryContentStatistics) results.get( 0 );
|
|
||||||
config.setStats( stats );
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public String getBaseUrlB()
|
public String getBaseUrl()
|
||||||
{
|
{
|
||||||
return baseUrl;
|
return baseUrl;
|
||||||
}
|
}
|
||||||
|
|
||||||
public void setBaseUrlB( String baseUrl )
|
|
||||||
{
|
|
||||||
this.baseUrl = baseUrl;
|
|
||||||
}
|
|
||||||
}
|
}
|
|
@ -0,0 +1,75 @@
|
||||||
|
package org.apache.maven.archiva.web.action.admin.repositories;
|
||||||
|
|
||||||
|
/*
|
||||||
|
* 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.
|
||||||
|
*/
|
||||||
|
|
||||||
|
import org.apache.commons.collections.Transformer;
|
||||||
|
import org.apache.maven.archiva.configuration.RepositoryConfiguration;
|
||||||
|
import org.apache.maven.archiva.database.ArchivaDAO;
|
||||||
|
import org.apache.maven.archiva.database.constraints.MostRecentRepositoryScanStatistics;
|
||||||
|
import org.apache.maven.archiva.model.RepositoryContentStatistics;
|
||||||
|
|
||||||
|
import java.util.List;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* RepositoryConfigurationAdminTransformer
|
||||||
|
*
|
||||||
|
* @author <a href="mailto:joakim@erdfelt.com">Joakim Erdfelt</a>
|
||||||
|
* @version $Id$
|
||||||
|
*
|
||||||
|
* @plexus.component role="org.apache.commons.collections.Transformer"
|
||||||
|
* role-hint="adminrepoconfig"
|
||||||
|
*/
|
||||||
|
public class RepositoryConfigurationAdminTransformer
|
||||||
|
implements Transformer
|
||||||
|
{
|
||||||
|
/**
|
||||||
|
* @plexus.requirement role-hint="jdo"
|
||||||
|
*/
|
||||||
|
private ArchivaDAO dao;
|
||||||
|
|
||||||
|
public Object transform( Object input )
|
||||||
|
{
|
||||||
|
if ( input instanceof RepositoryConfiguration )
|
||||||
|
{
|
||||||
|
RepositoryConfiguration repoconfig = (RepositoryConfiguration) input;
|
||||||
|
AdminRepositoryConfiguration arepo = new AdminRepositoryConfiguration( repoconfig );
|
||||||
|
|
||||||
|
if ( arepo.isManaged() )
|
||||||
|
{
|
||||||
|
arepo.setStats( getLatestStats( arepo.getId() ) );
|
||||||
|
}
|
||||||
|
|
||||||
|
return arepo;
|
||||||
|
}
|
||||||
|
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
private RepositoryContentStatistics getLatestStats( String repoId )
|
||||||
|
{
|
||||||
|
List results = dao.query( new MostRecentRepositoryScanStatistics( repoId ) );
|
||||||
|
if ( results.isEmpty() )
|
||||||
|
{
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
return (RepositoryContentStatistics) results.get( 0 );
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,73 @@
|
||||||
|
package org.apache.maven.archiva.web.action.admin.scanning;
|
||||||
|
|
||||||
|
/*
|
||||||
|
* 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.
|
||||||
|
*/
|
||||||
|
|
||||||
|
import com.opensymphony.webwork.interceptor.ServletRequestAware;
|
||||||
|
import com.opensymphony.xwork.ModelDriven;
|
||||||
|
import com.opensymphony.xwork.Preparable;
|
||||||
|
import com.opensymphony.xwork.Validateable;
|
||||||
|
|
||||||
|
import org.codehaus.plexus.security.ui.web.interceptor.SecureAction;
|
||||||
|
import org.codehaus.plexus.security.ui.web.interceptor.SecureActionBundle;
|
||||||
|
import org.codehaus.plexus.security.ui.web.interceptor.SecureActionException;
|
||||||
|
import org.codehaus.plexus.xwork.action.PlexusActionSupport;
|
||||||
|
|
||||||
|
import javax.servlet.http.HttpServletRequest;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* RepositoryScanningAction
|
||||||
|
*
|
||||||
|
* @author <a href="mailto:joakim@erdfelt.com">Joakim Erdfelt</a>
|
||||||
|
* @version $Id$
|
||||||
|
*
|
||||||
|
* @plexus.component role="com.opensymphony.xwork.Action" role-hint="repositoryScanningAction"
|
||||||
|
*/
|
||||||
|
public class RepositoryScanningAction
|
||||||
|
extends PlexusActionSupport
|
||||||
|
implements ModelDriven, Preparable, Validateable, SecureAction, ServletRequestAware
|
||||||
|
{
|
||||||
|
|
||||||
|
public Object getModel()
|
||||||
|
{
|
||||||
|
// TODO Auto-generated method stub
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void prepare()
|
||||||
|
throws Exception
|
||||||
|
{
|
||||||
|
// TODO Auto-generated method stub
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
public SecureActionBundle getSecureActionBundle()
|
||||||
|
throws SecureActionException
|
||||||
|
{
|
||||||
|
// TODO Auto-generated method stub
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setServletRequest( HttpServletRequest request )
|
||||||
|
{
|
||||||
|
// TODO Auto-generated method stub
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
|
@ -36,11 +36,15 @@
|
||||||
<interceptor name="pssSecureActions" class="pssSecureActionInterceptor"/>
|
<interceptor name="pssSecureActions" class="pssSecureActionInterceptor"/>
|
||||||
<interceptor name="pssAutoLogin" class="pssAutoLoginInterceptor"/>
|
<interceptor name="pssAutoLogin" class="pssAutoLoginInterceptor"/>
|
||||||
<interceptor name="pssPolicyEnforcement" class="pssPolicyEnforcementInterceptor"/>
|
<interceptor name="pssPolicyEnforcement" class="pssPolicyEnforcementInterceptor"/>
|
||||||
|
<interceptor name="paramFilter" class="com.opensymphony.xwork.interceptor.ParameterFilterInterceptor" />
|
||||||
|
|
||||||
<interceptor-stack name="configuredArchivaStack">
|
<interceptor-stack name="configuredArchivaStack">
|
||||||
<interceptor-ref name="pssForceAdminUser"/>
|
<interceptor-ref name="pssForceAdminUser"/>
|
||||||
<interceptor-ref name="pssAutoLogin"/>
|
<interceptor-ref name="pssAutoLogin"/>
|
||||||
<interceptor-ref name="defaultStack"/>
|
<interceptor-ref name="defaultStack"/>
|
||||||
|
<interceptor-ref name="paramFilter">
|
||||||
|
<param name="blocked">externalResult</param>
|
||||||
|
</interceptor-ref>
|
||||||
<interceptor-ref name="pssSecureActions"/>
|
<interceptor-ref name="pssSecureActions"/>
|
||||||
<interceptor-ref name="pssPolicyEnforcement"/>
|
<interceptor-ref name="pssPolicyEnforcement"/>
|
||||||
<interceptor-ref name="configuration"/>
|
<interceptor-ref name="configuration"/>
|
||||||
|
@ -225,8 +229,11 @@
|
||||||
<result name="input">/WEB-INF/jsp/admin/repositories.jsp</result>
|
<result name="input">/WEB-INF/jsp/admin/repositories.jsp</result>
|
||||||
</action>
|
</action>
|
||||||
|
|
||||||
|
<!-- .\ REPOSITORIES \.____________________________________________ -->
|
||||||
|
|
||||||
<action name="repositories" class="repositoriesAction" method="input">
|
<action name="repositories" class="repositoriesAction" method="input">
|
||||||
<result name="input">/WEB-INF/jsp/admin/repositories.jsp</result>
|
<result name="input">/WEB-INF/jsp/admin/repositories.jsp</result>
|
||||||
|
<result name="confirm" type="redirect-action">deleteRepository</result>
|
||||||
</action>
|
</action>
|
||||||
|
|
||||||
<action name="indexRepository" class="indexRepositoryAction" method="run">
|
<action name="indexRepository" class="indexRepositoryAction" method="run">
|
||||||
|
@ -235,26 +242,85 @@
|
||||||
|
|
||||||
<action name="addRepository" class="configureRepositoryAction" method="add">
|
<action name="addRepository" class="configureRepositoryAction" method="add">
|
||||||
<result name="input">/WEB-INF/jsp/admin/addRepository.jsp</result>
|
<result name="input">/WEB-INF/jsp/admin/addRepository.jsp</result>
|
||||||
<result type="redirect-action">repositories</result>
|
<result name="success" type="redirect-action">repositories</result>
|
||||||
<!-- <interceptor-ref name="unconfiguredArchivaStack"/> -->
|
<interceptor-ref name="configuredPrepareParamsStack"/>
|
||||||
</action>
|
</action>
|
||||||
|
|
||||||
<action name="editRepository" class="editRepositoryAction" method="edit">
|
<action name="editRepository" class="configureRepositoryAction" method="edit">
|
||||||
<result name="input">/WEB-INF/jsp/admin/editRepository.jsp</result>
|
<result name="input">/WEB-INF/jsp/admin/editRepository.jsp</result>
|
||||||
<result name="error" type="redirect-action">repositories</result>
|
<result name="error" type="redirect-action">repositories</result>
|
||||||
<result name="success" type="redirect-action">repositories</result>
|
<result name="success" type="redirect-action">repositories</result>
|
||||||
<interceptor-ref name="configuredPrepareParamsStack"/>
|
<interceptor-ref name="configuredPrepareParamsStack"/>
|
||||||
</action>
|
</action>
|
||||||
|
|
||||||
<action name="saveRepository" class="saveRepositoryAction" method="save">
|
<action name="saveRepository" class="configureRepositoryAction" method="save">
|
||||||
<result name="success" type="redirect-action">repositories</result>
|
<result name="success" type="redirect-action">repositories</result>
|
||||||
|
<interceptor-ref name="configuredPrepareParamsStack"/>
|
||||||
</action>
|
</action>
|
||||||
|
|
||||||
<action name="deleteRepository" class="deleteRepositoryAction">
|
<action name="deleteRepository" class="configureRepositoryAction" method="confirm">
|
||||||
<result name="input">/WEB-INF/jsp/admin/deleteRepository.jsp</result>
|
<result name="input">/WEB-INF/jsp/admin/deleteRepository.jsp</result>
|
||||||
<result type="redirect-action">repositories</result>
|
<result name="success" type="redirect-action">repositories</result>
|
||||||
|
<interceptor-ref name="configuredPrepareParamsStack"/>
|
||||||
</action>
|
</action>
|
||||||
|
|
||||||
|
<!-- .\ PROXY CONNECTORS \.________________________________________ -->
|
||||||
|
|
||||||
|
<action name="proxyConnectors" class="proxyConnectorsAction" method="input">
|
||||||
|
<result name="input">/WEB-INF/jsp/admin/proxyConnectors.jsp</result>
|
||||||
|
</action>
|
||||||
|
|
||||||
|
<action name="addProxyConnector" class="configureProxyConnectorAction" method="add">
|
||||||
|
<result name="input">/WEB-INF/jsp/admin/addProxyConnector.jsp</result>
|
||||||
|
<result name="success" type="redirect-action">proxyConnectors</result>
|
||||||
|
<interceptor-ref name="configuredPrepareParamsStack"/>
|
||||||
|
</action>
|
||||||
|
|
||||||
|
<action name="configureProxyConnector" class="configureProxyConnectorAction" method="input">
|
||||||
|
<result name="input">/WEB-INF/jsp/admin/editProxyConnector.jsp</result>
|
||||||
|
<result name="success" type="redirect-action">proxyConnectors</result>
|
||||||
|
<interceptor-ref name="configuredPrepareParamsStack"/>
|
||||||
|
</action>
|
||||||
|
|
||||||
|
<action name="editProxyConnector" class="configureProxyConnectorAction" method="edit">
|
||||||
|
<result name="input">/WEB-INF/jsp/admin/editProxyConnector.jsp</result>
|
||||||
|
<result name="success" type="redirect-action">proxyConnectors</result>
|
||||||
|
<interceptor-ref name="configuredPrepareParamsStack"/>
|
||||||
|
</action>
|
||||||
|
|
||||||
|
<action name="saveProxyConnector" class="configureProxyConnectorAction" method="save">
|
||||||
|
<result name="input">/WEB-INF/jsp/admin/editProxyConnector.jsp</result>
|
||||||
|
<result name="success" type="redirect-action">proxyConnectors</result>
|
||||||
|
<interceptor-ref name="configuredPrepareParamsStack"/>
|
||||||
|
</action>
|
||||||
|
|
||||||
|
<action name="deleteProxyConnector" class="configureProxyConnectorAction" method="confirm">
|
||||||
|
<result name="input">/WEB-INF/jsp/admin/deleteProxyConnector.jsp</result>
|
||||||
|
<result name="success" type="redirect-action">proxyConnectors</result>
|
||||||
|
<interceptor-ref name="configuredPrepareParamsStack"/>
|
||||||
|
</action>
|
||||||
|
|
||||||
|
<!-- .\ NETWORK PROXIES \._________________________________________ -->
|
||||||
|
|
||||||
|
<action name="networkProxies" class="networkProxiesAction" method="input">
|
||||||
|
<result name="input">/WEB-INF/jsp/admin/networkProxies.jsp</result>
|
||||||
|
</action>
|
||||||
|
|
||||||
|
<!-- .\ REPOSITORY SCANNING \._____________________________________ -->
|
||||||
|
|
||||||
|
<action name="repositoryScanning" class="repositoryScanningAction" method="input">
|
||||||
|
<result name="input">/WEB-INF/jsp/admin/repositoryScanning.jsp</result>
|
||||||
|
</action>
|
||||||
|
|
||||||
|
<!-- .\ DATABASE \.________________________________________________ -->
|
||||||
|
|
||||||
|
<action name="database" class="databaseAction" method="input">
|
||||||
|
<result name="input">/WEB-INF/jsp/admin/database.jsp</result>
|
||||||
|
</action>
|
||||||
|
|
||||||
|
<!-- .\ CONFIGURATION \.___________________________________________ -->
|
||||||
|
|
||||||
|
|
||||||
<action name="configure" class="configureAction" method="input">
|
<action name="configure" class="configureAction" method="input">
|
||||||
<result name="input">/WEB-INF/jsp/admin/configure.jsp</result>
|
<result name="input">/WEB-INF/jsp/admin/configure.jsp</result>
|
||||||
<interceptor-ref name="unconfiguredArchivaStack"/>
|
<interceptor-ref name="unconfiguredArchivaStack"/>
|
||||||
|
|
|
@ -21,27 +21,28 @@
|
||||||
|
|
||||||
<html>
|
<html>
|
||||||
<head>
|
<head>
|
||||||
<title>Configuration</title>
|
<title>Admin: Add Repository</title>
|
||||||
<ww:head/>
|
<ww:head/>
|
||||||
</head>
|
</head>
|
||||||
|
|
||||||
<body>
|
<body>
|
||||||
|
|
||||||
<h1>Configuration</h1>
|
<h1>Admin: Add Repository</h1>
|
||||||
|
|
||||||
<div id="contentArea">
|
<div id="contentArea">
|
||||||
|
|
||||||
<h2>Add Managed Repository</h2>
|
<h2>Add Repository</h2>
|
||||||
|
|
||||||
<ww:actionmessage/>
|
<ww:actionmessage/>
|
||||||
<ww:form method="post" action="addRepository" namespace="/admin" validate="true">
|
<ww:form method="post" action="saveRepository" namespace="/admin" validate="true">
|
||||||
<ww:textfield name="model.id" label="Identifier" size="10" required="true"/>
|
<ww:hidden name="mode" value="add"/>
|
||||||
<%@ include file="/WEB-INF/jsp/admin/include/managedRepositoryForm.jspf" %>
|
<ww:textfield name="repository.id" label="Identifier" size="10" required="true"/>
|
||||||
|
<%@ include file="/WEB-INF/jsp/admin/include/repositoryForm.jspf" %>
|
||||||
<ww:submit value="Add Repository"/>
|
<ww:submit value="Add Repository"/>
|
||||||
</ww:form>
|
</ww:form>
|
||||||
|
|
||||||
<script type="text/javascript">
|
<script type="text/javascript">
|
||||||
document.getElementById("addRepository_id").focus();
|
document.getElementById("saveRepository_id").focus();
|
||||||
</script>
|
</script>
|
||||||
|
|
||||||
</div>
|
</div>
|
||||||
|
|
|
@ -37,11 +37,11 @@
|
||||||
<strong><span class="statusFailed">WARNING:</span> This operation can not be undone.</strong>
|
<strong><span class="statusFailed">WARNING:</span> This operation can not be undone.</strong>
|
||||||
</blockquote>
|
</blockquote>
|
||||||
|
|
||||||
<ww:form method="post" action="deleteRepository" namespace="/admin" validate="true">
|
<ww:form method="post" action="deleteRepository!delete" namespace="/admin" validate="true">
|
||||||
<ww:hidden name="repoId"/>
|
<ww:hidden name="repoid"/>
|
||||||
<ww:radio list="#@java.util.LinkedHashMap@{'delete-contents' : 'Remove the repository and delete its contents from disk',
|
<ww:radio list="#@java.util.LinkedHashMap@{'delete-contents' : 'Remove the repository and delete its contents from disk',
|
||||||
'delete-entry' : 'Remove the repository from the management list, but leave the contents unmodified',
|
'delete-entry' : 'Remove the repository from the management list, but leave the contents unmodified',
|
||||||
'unmodified' : 'Leave the repository unmodified'}" name="operation" theme="archiva"/>
|
'unmodified' : 'Leave the repository unmodified'}" name="mode" theme="archiva"/>
|
||||||
<ww:submit value="Go"/>
|
<ww:submit value="Go"/>
|
||||||
</ww:form>
|
</ww:form>
|
||||||
</div>
|
</div>
|
||||||
|
|
|
@ -0,0 +1,52 @@
|
||||||
|
<%--
|
||||||
|
~ 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.
|
||||||
|
--%>
|
||||||
|
|
||||||
|
<%@ taglib prefix="ww" uri="/webwork" %>
|
||||||
|
|
||||||
|
<html>
|
||||||
|
<head>
|
||||||
|
<title>Admin : Edit Proxy Connector</title>
|
||||||
|
<ww:head/>
|
||||||
|
</head>
|
||||||
|
|
||||||
|
<body>
|
||||||
|
|
||||||
|
<h1>Admin : Edit Proxy Connector</h1>
|
||||||
|
|
||||||
|
<div id="contentArea">
|
||||||
|
|
||||||
|
<h2>Edit Proxy Connector</h2>
|
||||||
|
|
||||||
|
<ww:actionerror/>
|
||||||
|
<ww:actionmessage/>
|
||||||
|
|
||||||
|
<ww:form method="post" action="saveProxyConnector" namespace="/admin" validate="false">
|
||||||
|
<ww:hidden name="mode"/>
|
||||||
|
<%@ include file="/WEB-INF/jsp/admin/include/proxyConnectorForm.jspf" %>
|
||||||
|
<ww:submit value="Save Proxy Connector"/>
|
||||||
|
</ww:form>
|
||||||
|
|
||||||
|
<script type="text/javascript">
|
||||||
|
document.getElementById("saveProxyConnector_proxyId").focus();
|
||||||
|
</script>
|
||||||
|
|
||||||
|
</div>
|
||||||
|
|
||||||
|
</body>
|
||||||
|
</html>
|
|
@ -21,28 +21,28 @@
|
||||||
|
|
||||||
<html>
|
<html>
|
||||||
<head>
|
<head>
|
||||||
<title>Configuration</title>
|
<title>Admin: Edit Repository</title>
|
||||||
<ww:head/>
|
<ww:head/>
|
||||||
</head>
|
</head>
|
||||||
|
|
||||||
<body>
|
<body>
|
||||||
|
|
||||||
<h1>Configuration</h1>
|
<h1>Admin: Edit Repository</h1>
|
||||||
|
|
||||||
<div id="contentArea">
|
<div id="contentArea">
|
||||||
|
|
||||||
<h2>Edit Managed Repository</h2>
|
<h2>Edit Repository</h2>
|
||||||
|
|
||||||
<ww:actionmessage/>
|
<ww:actionmessage/>
|
||||||
<ww:form method="post" action="saveRepository" namespace="/admin" validate="false">
|
<ww:form method="post" action="saveRepository" namespace="/admin" validate="false">
|
||||||
<ww:hidden name="mode"/>
|
<ww:hidden name="mode" value="edit"/>
|
||||||
<ww:hidden name="id"/>
|
<ww:hidden name="repository.id"/>
|
||||||
<%@ include file="/WEB-INF/jsp/admin/include/managedRepositoryForm.jspf" %>
|
<%@ include file="/WEB-INF/jsp/admin/include/repositoryForm.jspf" %>
|
||||||
<ww:submit value="Update Repository"/>
|
<ww:submit value="Update Repository"/>
|
||||||
</ww:form>
|
</ww:form>
|
||||||
|
|
||||||
<script type="text/javascript">
|
<script type="text/javascript">
|
||||||
document.getElementById("editRepository_name").focus();
|
document.getElementById("saveRepository_name").focus();
|
||||||
</script>
|
</script>
|
||||||
|
|
||||||
</div>
|
</div>
|
||||||
|
|
|
@ -1,42 +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.
|
|
||||||
--%>
|
|
||||||
|
|
||||||
<%@ taglib prefix="ww" uri="/webwork" %>
|
|
||||||
<ww:textfield name="name" label="Name" size="50" required="true"/>
|
|
||||||
<ww:textfield name="url" label="URL" size="50" required="true"/>
|
|
||||||
<ww:select list="#@java.util.LinkedHashMap@{'default' : 'Maven 2.x Repository', 'legacy' : 'Maven 1.x Repository'}"
|
|
||||||
name="layout" label="Type"/>
|
|
||||||
<ww:select name="snapshotsPolicy" label="Snapshots" list="#@java.util.LinkedHashMap@{
|
|
||||||
'disabled' : 'Disabled',
|
|
||||||
'daily' : 'Enabled, updated daily',
|
|
||||||
'hourly' : 'Enabled, updated hourly',
|
|
||||||
'never' : 'Enabled, never updated',
|
|
||||||
'interval' : 'Enabled, updated on given interval'}"/>
|
|
||||||
<ww:textfield label="Snapshot update interval" name="snapshotsInterval" size="4"/>
|
|
||||||
<ww:select name="releasesPolicy" label="Releases" list="#@java.util.LinkedHashMap@{
|
|
||||||
'disabled' : 'Disabled',
|
|
||||||
'daily' : 'Enabled, updated daily',
|
|
||||||
'hourly' : 'Enabled, updated hourly',
|
|
||||||
'never' : 'Enabled, never updated',
|
|
||||||
'interval' : 'Enabled, updated on given interval'}"/>
|
|
||||||
<ww:textfield label="Release update interval" name="releasesInterval" size="4"/>
|
|
||||||
<ww:select list="configuration.repositoriesMap" name="managedRepository" label="Proxied through"/>
|
|
||||||
<ww:checkbox name="useNetworkProxy" fieldValue="true" label="Use HTTP Proxy"/>
|
|
||||||
<ww:checkbox name="cacheFailures" fieldValue="true" label="Cache Failures"/>
|
|
||||||
<ww:checkbox name="hardFail" fieldValue="true" label="Fail Whole Group"/>
|
|
|
@ -0,0 +1,196 @@
|
||||||
|
<%--
|
||||||
|
~ 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.
|
||||||
|
--%>
|
||||||
|
<%@ taglib prefix="ww" uri="/webwork" %>
|
||||||
|
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
|
||||||
|
|
||||||
|
<c:url var="iconDeleteUrl" value="/images/icons/delete.gif" />
|
||||||
|
|
||||||
|
<input type="hidden" name="pattern"/>
|
||||||
|
<ww:select name="connector.proxyId" list="proxyIdOptions" label="Network Proxy" required="true"/>
|
||||||
|
<ww:select name="connector.sourceRepoId" list="localRepoIdList" label="Local Repository" required="true"/>
|
||||||
|
<ww:select name="connector.targetRepoId" list="remoteRepoIdList" label="Remote Repository" required="true" />
|
||||||
|
|
||||||
|
<script type="text/javascript">
|
||||||
|
<!--
|
||||||
|
function setAndSubmit(id, value, action)
|
||||||
|
{
|
||||||
|
var f = document.forms.saveProxyConnector;
|
||||||
|
|
||||||
|
f.action = action;
|
||||||
|
f[id].value = value;
|
||||||
|
f.submit();
|
||||||
|
}
|
||||||
|
//-->
|
||||||
|
</script>
|
||||||
|
|
||||||
|
<tr><td valign="top"><label>Policies:</label></td>
|
||||||
|
<td>
|
||||||
|
<table>
|
||||||
|
<c:forEach items="${policyMap}" var="policy" varStatus="i">
|
||||||
|
<tr>
|
||||||
|
<td>
|
||||||
|
<ww:label for="policy_${policy.key}" required="true"
|
||||||
|
theme="simple">${policy.key}:</ww:label>
|
||||||
|
</td>
|
||||||
|
<td>
|
||||||
|
<ww:select name="connector.policies['${policy.key}']"
|
||||||
|
list="policyMap['${policy.key}'].options"
|
||||||
|
value="connector.policies['${policy.key}']"
|
||||||
|
id="policy_${policy.key}"
|
||||||
|
theme="simple"
|
||||||
|
cssStyle="width: 10em" />
|
||||||
|
</td>
|
||||||
|
</tr>
|
||||||
|
</c:forEach>
|
||||||
|
</table>
|
||||||
|
</td></tr>
|
||||||
|
|
||||||
|
<tr class="seperator">
|
||||||
|
<td valign="top">
|
||||||
|
<label for="propertiesEntry">Properties:</label>
|
||||||
|
</td>
|
||||||
|
<td>
|
||||||
|
<ww:textfield name="propertyKey" size="15" id="propertiesEntry" theme="simple" /> :
|
||||||
|
<ww:textfield name="propertyValue" size="15" id="propertiesValue" theme="simple" />
|
||||||
|
<ww:submit name="action:editProxyConnector!addProperty" value="Add Property" theme="simple" />
|
||||||
|
</td>
|
||||||
|
</tr>
|
||||||
|
<tr>
|
||||||
|
<td>
|
||||||
|
</td>
|
||||||
|
<td>
|
||||||
|
<c:choose>
|
||||||
|
<c:when test="${empty(connector.properties)}">
|
||||||
|
<i>No properties have been set.</i>
|
||||||
|
</c:when>
|
||||||
|
<c:otherwise>
|
||||||
|
<ww:url id="removePropertyUrl"
|
||||||
|
action="editProxyConnector"
|
||||||
|
method="removeProperty" />
|
||||||
|
<table>
|
||||||
|
<c:forEach items="${connector.properties}" var="property" varStatus="i">
|
||||||
|
<tr>
|
||||||
|
<td>
|
||||||
|
<ww:label for="property_${property.key}"
|
||||||
|
theme="simple">${property.key}</ww:label>
|
||||||
|
</td>
|
||||||
|
<td>
|
||||||
|
<ww:textfield name="connector.properties['${property.key}']"
|
||||||
|
size="15"
|
||||||
|
id="property_${property.key}"
|
||||||
|
theme="simple" />
|
||||||
|
</td>
|
||||||
|
<td>
|
||||||
|
<ww:a href="#" title="Remove [${property.key}] Property"
|
||||||
|
onclick="setAndSubmit('propertyKey', '${property.key}', '%{removePropertyUrl}')"
|
||||||
|
theme="simple">
|
||||||
|
<img src="${iconDeleteUrl}" /></ww:a>
|
||||||
|
|
||||||
|
</td>
|
||||||
|
</tr>
|
||||||
|
</c:forEach>
|
||||||
|
</table>
|
||||||
|
</c:otherwise>
|
||||||
|
</c:choose>
|
||||||
|
</td>
|
||||||
|
</tr>
|
||||||
|
|
||||||
|
<tr class="seperator">
|
||||||
|
<td valign="top">
|
||||||
|
<label for="blackListEntry">Black List:</label>
|
||||||
|
</td>
|
||||||
|
<td>
|
||||||
|
<ww:textfield name="blackListPattern" size="30" id="blackListEntry" theme="simple" />
|
||||||
|
<ww:submit name="action:editProxyConnector!addBlackListPattern" value="Add Pattern" theme="simple" />
|
||||||
|
</td>
|
||||||
|
</tr>
|
||||||
|
<tr>
|
||||||
|
<td>
|
||||||
|
</td>
|
||||||
|
<td>
|
||||||
|
<ww:url id="removeBlackListPatternUrl"
|
||||||
|
action="editProxyConnector"
|
||||||
|
method="removeBlackListPattern" />
|
||||||
|
<c:choose>
|
||||||
|
<c:when test="${empty(connector.blackListPatterns)}">
|
||||||
|
<i>No black list patterns have been set.</i>
|
||||||
|
</c:when>
|
||||||
|
<c:otherwise>
|
||||||
|
<table>
|
||||||
|
<c:forEach items="${connector.blackListPatterns}" var="pattern" varStatus="i">
|
||||||
|
<tr>
|
||||||
|
<td>
|
||||||
|
<ww:hidden name="connector.blackListPatterns" value="${pattern}"/>
|
||||||
|
<code>"${pattern}"</code>
|
||||||
|
</td>
|
||||||
|
<td>
|
||||||
|
<ww:a href="#" title="Remove [${pattern}] Pattern"
|
||||||
|
onclick="setAndSubmit('pattern', '${pattern}', '%{removeBlackListPatternUrl}')"
|
||||||
|
theme="simple">
|
||||||
|
<img src="${iconDeleteUrl}" /></ww:a>
|
||||||
|
</td>
|
||||||
|
</tr>
|
||||||
|
</c:forEach>
|
||||||
|
</table>
|
||||||
|
</c:otherwise>
|
||||||
|
</c:choose>
|
||||||
|
</td>
|
||||||
|
</tr>
|
||||||
|
|
||||||
|
<tr class="seperator">
|
||||||
|
<td valign="top">
|
||||||
|
<label for="whiteListEntry">White List:</label>
|
||||||
|
</td>
|
||||||
|
<td>
|
||||||
|
<ww:textfield name="whiteListPattern" size="30" id="whiteListEntry" theme="simple" />
|
||||||
|
<ww:submit name="action:editProxyConnector!addWhiteListPattern" value="Add Pattern" theme="simple" />
|
||||||
|
</td>
|
||||||
|
</tr>
|
||||||
|
<tr>
|
||||||
|
<td>
|
||||||
|
</td>
|
||||||
|
<td>
|
||||||
|
<ww:url id="removeWhiteListPatternUrl"
|
||||||
|
action="editProxyConnector"
|
||||||
|
method="removeWhiteListPattern" />
|
||||||
|
<c:choose>
|
||||||
|
<c:when test="${empty(connector.whiteListPatterns)}">
|
||||||
|
<i>No white list patterns have been set.</i>
|
||||||
|
</c:when>
|
||||||
|
<c:otherwise>
|
||||||
|
<table>
|
||||||
|
<c:forEach items="${connector.whiteListPatterns}" var="pattern" varStatus="i">
|
||||||
|
<tr>
|
||||||
|
<td>
|
||||||
|
<ww:hidden name="connector.whiteListPatterns" value="${pattern}"/>
|
||||||
|
<code>"${pattern}"</code>
|
||||||
|
</td>
|
||||||
|
<td>
|
||||||
|
<ww:a href="#" title="Remove [${pattern}] Pattern"
|
||||||
|
onclick="setAndSubmit('pattern', '${pattern}', '%{removeWhiteListPatternUrl}')"
|
||||||
|
theme="simple">
|
||||||
|
<img src="${iconDeleteUrl}" /></ww:a>
|
||||||
|
</td>
|
||||||
|
</tr>
|
||||||
|
</c:forEach>
|
||||||
|
</table>
|
||||||
|
</c:otherwise>
|
||||||
|
</c:choose>
|
||||||
|
</td>
|
||||||
|
</tr>
|
|
@ -19,11 +19,11 @@
|
||||||
<%@ taglib prefix="ww" uri="/webwork" %>
|
<%@ taglib prefix="ww" uri="/webwork" %>
|
||||||
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
|
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
|
||||||
|
|
||||||
<ww:textfield name="name" label="Name" size="50" required="true"/>
|
<ww:textfield name="repository.name" label="Name" size="50" required="true"/>
|
||||||
<ww:textfield name="directory" label="Directory" size="100" required="true"/>
|
<ww:textfield name="repository.url" label="Directory or URL" size="100" required="true"/>
|
||||||
<ww:select list="#@java.util.LinkedHashMap@{'default' : 'Maven 2.x Repository', 'legacy' : 'Maven 1.x Repository'}"
|
<ww:select list="#@java.util.LinkedHashMap@{'default' : 'Maven 2.x Repository', 'legacy' : 'Maven 1.x Repository'}"
|
||||||
name="layout" label="Type"/>
|
name="repository.layout" label="Type"/>
|
||||||
<ww:textfield name="refreshCronExpression" label="Cron" size="100" required="true" />
|
<ww:textfield name="repository.refreshCronExpression" label="Cron" size="100" required="true" />
|
||||||
<ww:checkbox name="releases" fieldValue="true" label="Releases Included"/>
|
<ww:checkbox name="repository.releases" fieldValue="true" label="Releases Included"/>
|
||||||
<ww:checkbox name="snapshots" fieldValue="false" label="Snapshots Included"/>
|
<ww:checkbox name="repository.snapshots" fieldValue="false" label="Snapshots Included"/>
|
||||||
<ww:checkbox name="indexed" fieldValue="true" label="Indexed"/>
|
<ww:checkbox name="repository.indexed" fieldValue="true" label="Indexed"/>
|
|
@ -1,46 +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.
|
|
||||||
--%>
|
|
||||||
|
|
||||||
<ww:hidden name="method"/>
|
|
||||||
<ww:textfield name="name" label="Name" size="50"/>
|
|
||||||
<ww:select list="#@java.util.LinkedHashMap@{'default' : 'Maven 2.x Repository', 'legacy' : 'Maven 1.x Repository'}"
|
|
||||||
name="layout" label="Type"/>
|
|
||||||
<ww:select list="configuration.repositoriesMap" name="managedRepository" label="Synced to"/>
|
|
||||||
<ww:textfield name="cronExpression" label="Schedule"/>
|
|
||||||
|
|
||||||
<ww:set name="method" value="method"/>
|
|
||||||
<c:choose>
|
|
||||||
<c:when test="${method == 'cvs'}">
|
|
||||||
<ww:textfield name="properties['cvsRoot']" label="CVS Root" size="100"/>
|
|
||||||
</c:when>
|
|
||||||
<c:when test="${method == 'svn'}">
|
|
||||||
<ww:textfield name="properties['svnUrl']" label="Subversion URL" size="100"/>
|
|
||||||
<ww:textfield name="properties['username']" label="Subversion Username" size="30"/>
|
|
||||||
</c:when>
|
|
||||||
<c:when test="${method == 'rsync'}">
|
|
||||||
<ww:textfield name="properties['rsyncHost']" label="Rsync Host"/>
|
|
||||||
<ww:textfield name="properties['rsyncDirectory']" label="Rsync Directory" size="100"/>
|
|
||||||
<ww:select name="properties['rsyncMethod']" label="Rsync Method"
|
|
||||||
list="#@java.util.LinkedHashMap@{'rsync' : 'Anonymous', 'ssh' : 'SSH'}"/>
|
|
||||||
<ww:textfield name="properties['username']" label="Rsync Username" size="30"/>
|
|
||||||
</c:when>
|
|
||||||
<c:when test="${method == 'file'}">
|
|
||||||
<ww:textfield name="properties['directory']" label="Directory" size="100"/>
|
|
||||||
</c:when>
|
|
||||||
</c:choose>
|
|
|
@ -0,0 +1,170 @@
|
||||||
|
<%--
|
||||||
|
~ 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.
|
||||||
|
--%>
|
||||||
|
|
||||||
|
<%@ taglib prefix="ww" uri="/webwork" %>
|
||||||
|
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
|
||||||
|
<%@ taglib prefix="fn" uri="http://java.sun.com/jsp/jstl/functions" %>
|
||||||
|
<%@ taglib prefix="pss" uri="/plexusSecuritySystem" %>
|
||||||
|
<%@ taglib prefix="archiva" uri="http://maven.apache.org/archiva" %>
|
||||||
|
|
||||||
|
<html>
|
||||||
|
<head>
|
||||||
|
<title>Administration - Proxy Connectors</title>
|
||||||
|
<ww:head/>
|
||||||
|
</head>
|
||||||
|
|
||||||
|
<body>
|
||||||
|
|
||||||
|
<h1>Administration - Proxy Connectors</h1>
|
||||||
|
|
||||||
|
<div id="contentArea">
|
||||||
|
|
||||||
|
<ww:actionerror />
|
||||||
|
<ww:actionmessage />
|
||||||
|
|
||||||
|
<div style="float:right">
|
||||||
|
<pss:ifAnyAuthorized permissions="archiva-manage-configuration">
|
||||||
|
<ww:url id="addProxyConnectorUrl" action="addProxyConnector" />
|
||||||
|
<ww:a href="%{addProxyConnectorUrl}" cssClass="create">
|
||||||
|
<img src="<c:url value="/images/icons/create.png" />" />
|
||||||
|
Add Proxy Connector
|
||||||
|
</ww:a>
|
||||||
|
</pss:ifAnyAuthorized>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<h2>Repository Proxy Connectors</h2>
|
||||||
|
|
||||||
|
<c:choose>
|
||||||
|
<c:when test="${empty(proxyConnectorMap)}">
|
||||||
|
<strong>No Repository Proxy Connectors Defined.</strong>
|
||||||
|
</c:when>
|
||||||
|
<c:otherwise>
|
||||||
|
<table width="100%">
|
||||||
|
<c:forEach items="${proxyConnectorMap}" var="repository" varStatus="i">
|
||||||
|
|
||||||
|
<c:forEach items="${repository.value}" var="connector" varStatus="pc">
|
||||||
|
<tr class="proxyConnector">
|
||||||
|
<c:if test="${pc.first}">
|
||||||
|
<td class="managedRepo" rowspan="${fn:length(repository.value)}">
|
||||||
|
<div>
|
||||||
|
<img src="<c:url value="/images/archiva-splat-32.gif"/>" />
|
||||||
|
<p class="id">${repository.key}</p>
|
||||||
|
<p class="name">${repoMap[repository.key].name}</p>
|
||||||
|
</div>
|
||||||
|
</td>
|
||||||
|
</c:if>
|
||||||
|
<td class="connector">
|
||||||
|
<div class="wrap">
|
||||||
|
<div class="controls">
|
||||||
|
<pss:ifAnyAuthorized permissions="archiva-manage-configuration">
|
||||||
|
<ww:url id="editProxyConnectorUrl" action="editProxyConnector">
|
||||||
|
<ww:param name="target" value="%{'${connector.targetRepoId}'}" />
|
||||||
|
<ww:param name="source" value="%{'${connector.sourceRepoId}'}" />
|
||||||
|
</ww:url>
|
||||||
|
<ww:url id="deleteProxyConnectorUrl" action="deleteProxyConnector" method="confirm">
|
||||||
|
<ww:param name="source" value="%{'${connector.sourceRepoId}'}" />
|
||||||
|
<ww:param name="target" value="%{'${connector.targetRepoId}'}" />
|
||||||
|
</ww:url>
|
||||||
|
<ww:a href="%{editProxyConnectorUrl}" cssClass="edit" title="Edit Proxy Connector">
|
||||||
|
<img src="<c:url value="/images/icons/edit.png" />" />
|
||||||
|
</ww:a>
|
||||||
|
<ww:a href="%{deleteProxyConnectorUrl}" cssClass="delete" title="Delete Proxy Connector">
|
||||||
|
<img src="<c:url value="/images/icons/delete.gif" />" />
|
||||||
|
</ww:a>
|
||||||
|
</pss:ifAnyAuthorized>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<h4>Proxy Connector</h4>
|
||||||
|
<table>
|
||||||
|
<tr>
|
||||||
|
<th nowrap="nowrap">Network Proxy:</th>
|
||||||
|
<td>
|
||||||
|
<c:choose>
|
||||||
|
<c:when test="${empty(connector.proxyId)}">
|
||||||
|
<i>(Direct Connection)</i>
|
||||||
|
</c:when>
|
||||||
|
<c:otherwise>
|
||||||
|
${connector.proxyId}
|
||||||
|
</c:otherwise>
|
||||||
|
</c:choose>
|
||||||
|
</td>
|
||||||
|
</tr>
|
||||||
|
<tr>
|
||||||
|
<th>Policies:</th>
|
||||||
|
<td nowrap="nowrap">
|
||||||
|
<c:forEach items="${connector.policies}" var="policies">
|
||||||
|
<p><em>${policies.key}</em>: ${policies.value}</p>
|
||||||
|
</c:forEach>
|
||||||
|
</td>
|
||||||
|
</tr>
|
||||||
|
|
||||||
|
<c:if test="${not(empty(connector.whiteListPatterns))}">
|
||||||
|
<tr>
|
||||||
|
<th nowrap="nowrap">White List:</th>
|
||||||
|
<td nowrap="nowrap">
|
||||||
|
<c:forEach items="${connector.whiteListPatterns}" var="pattern">
|
||||||
|
<p><code>"${pattern}"</code></p>
|
||||||
|
</c:forEach>
|
||||||
|
</td>
|
||||||
|
</tr>
|
||||||
|
</c:if>
|
||||||
|
|
||||||
|
<c:if test="${not(empty(connector.blackListPatterns))}">
|
||||||
|
<tr>
|
||||||
|
<th nowrap="nowrap">Black List:</th>
|
||||||
|
<td>
|
||||||
|
<c:forEach items="${connector.blackListPatterns}" var="pattern">
|
||||||
|
<p><code>"${pattern}"</code></p>
|
||||||
|
</c:forEach>
|
||||||
|
</td>
|
||||||
|
</tr>
|
||||||
|
</c:if>
|
||||||
|
|
||||||
|
<c:if test="${not(empty(connector.properties))}">
|
||||||
|
<tr>
|
||||||
|
<th>Properties:</th>
|
||||||
|
<td>
|
||||||
|
<c:forEach items="${connector.properties}" var="prop">
|
||||||
|
<p><em>${prop.key}</em>: ${prop.value}</p>
|
||||||
|
</c:forEach>
|
||||||
|
</td>
|
||||||
|
</tr>
|
||||||
|
</c:if>
|
||||||
|
</table>
|
||||||
|
</div>
|
||||||
|
</td>
|
||||||
|
<td class="remoteRepo">
|
||||||
|
<div>
|
||||||
|
<img src="<c:url value="/images/archiva-world.png"/>" />
|
||||||
|
<p class="id">${connector.targetRepoId}</p>
|
||||||
|
<p class="name">${repoMap[connector.targetRepoId].name}</p>
|
||||||
|
<p class="url">${repoMap[connector.targetRepoId].url}</p>
|
||||||
|
</div>
|
||||||
|
</td>
|
||||||
|
</tr>
|
||||||
|
</c:forEach>
|
||||||
|
</c:forEach>
|
||||||
|
</table>
|
||||||
|
</c:otherwise>
|
||||||
|
</c:choose>
|
||||||
|
|
||||||
|
</div>
|
||||||
|
|
||||||
|
</body>
|
||||||
|
</html>
|
|
@ -37,28 +37,30 @@
|
||||||
<ww:actionerror />
|
<ww:actionerror />
|
||||||
<ww:actionmessage />
|
<ww:actionmessage />
|
||||||
|
|
||||||
<div>
|
<div>
|
||||||
<div style="float: right">
|
<div style="float: right">
|
||||||
<%-- TODO replace with icons --%>
|
<%-- TODO replace with icons --%>
|
||||||
<pss:ifAuthorized permission="archiva-manage-configuration">
|
<pss:ifAuthorized permission="archiva-manage-configuration">
|
||||||
<ww:url id="addRepositoryUrl" action="addRepository"/>
|
<ww:url id="addRepositoryUrl" action="addRepository"/>
|
||||||
<ww:a href="%{addRepositoryUrl}">Add Repository</ww:a>
|
<ww:a href="%{addRepositoryUrl}">
|
||||||
</pss:ifAuthorized>
|
<img src="<c:url value="/images/icons/create.png" />" />
|
||||||
|
Add Repository</ww:a>
|
||||||
|
</pss:ifAuthorized>
|
||||||
|
</div>
|
||||||
|
<h2>Local Repositories</h2>
|
||||||
</div>
|
</div>
|
||||||
<h2>Managed Repositories</h2>
|
|
||||||
</div>
|
|
||||||
|
|
||||||
<c:choose>
|
<c:choose>
|
||||||
<c:when test="${empty(model.managedRepositories)}">
|
<c:when test="${empty(managedRepositories)}">
|
||||||
<%-- No Managed Repositories. --%>
|
<%-- No Local Repositories. --%>
|
||||||
<strong>There are no managed repositories configured yet.</strong>
|
<strong>There are no local repositories configured yet.</strong>
|
||||||
</c:when>
|
</c:when>
|
||||||
<c:otherwise>
|
<c:otherwise>
|
||||||
<%-- Display the repositories. --%>
|
<%-- Display the repositories. --%>
|
||||||
|
|
||||||
<c:forEach items="${model.managedRepositories}" var="repository" varStatus="i">
|
<c:forEach items="${managedRepositories}" var="repository" varStatus="i">
|
||||||
|
|
||||||
<div>
|
<div class="repository">
|
||||||
|
|
||||||
<div style="float: right">
|
<div style="float: right">
|
||||||
<%-- TODO: make some icons --%>
|
<%-- TODO: make some icons --%>
|
||||||
|
@ -69,12 +71,20 @@
|
||||||
<ww:url id="deleteRepositoryUrl" action="deleteRepository" method="confirm">
|
<ww:url id="deleteRepositoryUrl" action="deleteRepository" method="confirm">
|
||||||
<ww:param name="repoid" value="%{'${repository.id}'}" />
|
<ww:param name="repoid" value="%{'${repository.id}'}" />
|
||||||
</ww:url>
|
</ww:url>
|
||||||
<ww:a href="%{editRepositoryUrl}">Edit Repository</ww:a>
|
<ww:a href="%{editRepositoryUrl}">
|
||||||
<ww:a href="%{deleteRepositoryUrl}">Delete Repository</ww:a>
|
<img src="<c:url value="/images/icons/edit.png" />" />
|
||||||
|
Edit Repository</ww:a>
|
||||||
|
<ww:a href="%{deleteRepositoryUrl}">
|
||||||
|
<img src="<c:url value="/images/icons/delete.gif" />" />
|
||||||
|
Delete Repository</ww:a>
|
||||||
</pss:ifAnyAuthorized>
|
</pss:ifAnyAuthorized>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<h3>${repository.name}</h3>
|
<div style="float: left">
|
||||||
|
<img src="<c:url value="/images/archiva-splat-32.gif"/>" />
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<h3 class="repository">${repository.name}</h3>
|
||||||
|
|
||||||
<table class="infoTable">
|
<table class="infoTable">
|
||||||
<tr>
|
<tr>
|
||||||
|
@ -93,7 +103,7 @@
|
||||||
</tr>
|
</tr>
|
||||||
<tr>
|
<tr>
|
||||||
<th>WebDAV URL</th>
|
<th>WebDAV URL</th>
|
||||||
<td><a href="${model.baseUrl}/${repository.id}/">${model.baseUrl}/${repository.id}/</a></td>
|
<td><a href="${baseUrl}/${repository.id}/">${baseUrl}/${repository.id}/</a></td>
|
||||||
</tr>
|
</tr>
|
||||||
<tr>
|
<tr>
|
||||||
<th>Type</th>
|
<th>Type</th>
|
||||||
|
@ -179,6 +189,83 @@
|
||||||
</c:otherwise>
|
</c:otherwise>
|
||||||
</c:choose>
|
</c:choose>
|
||||||
|
|
||||||
|
<h2>Remote Repositories</h2>
|
||||||
|
|
||||||
|
<c:choose>
|
||||||
|
<c:when test="${empty(remoteRepositories)}">
|
||||||
|
<%-- No Remote Repositories. --%>
|
||||||
|
<strong>There are no remote repositories configured yet.</strong>
|
||||||
|
</c:when>
|
||||||
|
<c:otherwise>
|
||||||
|
<%-- Display the repositories. --%>
|
||||||
|
|
||||||
|
<c:forEach items="${remoteRepositories}" var="repository" varStatus="i">
|
||||||
|
<div class="repository">
|
||||||
|
|
||||||
|
<div style="float: right">
|
||||||
|
<%-- TODO: make some icons --%>
|
||||||
|
<pss:ifAnyAuthorized permissions="archiva-manage-configuration">
|
||||||
|
<ww:url id="editRepositoryUrl" action="editRepository">
|
||||||
|
<ww:param name="repoid" value="%{'${repository.id}'}" />
|
||||||
|
</ww:url>
|
||||||
|
<ww:url id="deleteRepositoryUrl" action="deleteRepository" method="confirm">
|
||||||
|
<ww:param name="repoid" value="%{'${repository.id}'}" />
|
||||||
|
</ww:url>
|
||||||
|
<ww:a href="%{editRepositoryUrl}">
|
||||||
|
<img src="<c:url value="/images/icons/edit.png" />" />
|
||||||
|
Edit Repository</ww:a>
|
||||||
|
<ww:a href="%{deleteRepositoryUrl}">
|
||||||
|
<img src="<c:url value="/images/icons/delete.gif" />" />
|
||||||
|
Delete Repository</ww:a>
|
||||||
|
</pss:ifAnyAuthorized>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div style="float: left">
|
||||||
|
<img src="<c:url value="/images/archiva-world.png"/>" />
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<h3 class="repository">${repository.name}</h3>
|
||||||
|
|
||||||
|
<table class="infoTable">
|
||||||
|
<tr>
|
||||||
|
<th>Identifier</th>
|
||||||
|
<td>
|
||||||
|
<code>${repository.id}</code>
|
||||||
|
</td>
|
||||||
|
</tr>
|
||||||
|
<tr>
|
||||||
|
<th>URL</th>
|
||||||
|
<td>${repository.url}</td>
|
||||||
|
</tr>
|
||||||
|
<tr>
|
||||||
|
<th>Type</th>
|
||||||
|
<%-- TODO: can probably just use layout appended to a key prefix in i18n to simplify this --%>
|
||||||
|
<td>
|
||||||
|
<c:choose>
|
||||||
|
<c:when test="${repository.layout == 'default'}">
|
||||||
|
Maven 2.x Repository
|
||||||
|
</c:when>
|
||||||
|
<c:otherwise>
|
||||||
|
Maven 1.x Repository
|
||||||
|
</c:otherwise>
|
||||||
|
</c:choose>
|
||||||
|
</td>
|
||||||
|
</tr>
|
||||||
|
<tr>
|
||||||
|
<th>Releases Included</th>
|
||||||
|
<td class="${repository.releases ? 'donemark' : 'errormark'} booleanIcon"> ${repository.releases}</td>
|
||||||
|
</tr>
|
||||||
|
<tr>
|
||||||
|
<th>Snapshots Included</th>
|
||||||
|
<td class="${repository.snapshots ? 'donemark' : 'errormark'} booleanIcon"> ${repository.snapshots}</td>
|
||||||
|
</tr>
|
||||||
|
</table>
|
||||||
|
|
||||||
|
</div>
|
||||||
|
</c:forEach>
|
||||||
|
</c:otherwise>
|
||||||
|
</c:choose>
|
||||||
|
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
</body>
|
</body>
|
||||||
|
|
|
@ -116,29 +116,35 @@
|
||||||
<my:currentWWUrl action="configureAppearance" namespace="/admin">Appearance</my:currentWWUrl>
|
<my:currentWWUrl action="configureAppearance" namespace="/admin">Appearance</my:currentWWUrl>
|
||||||
</li>
|
</li>
|
||||||
</pss:ifAuthorized>
|
</pss:ifAuthorized>
|
||||||
|
<%-- TODO: future options here.
|
||||||
|
* Repository Statistics.
|
||||||
|
* Web Services Statistics.
|
||||||
|
--%>
|
||||||
</ul>
|
</ul>
|
||||||
</pss:ifAnyAuthorized>
|
</pss:ifAnyAuthorized>
|
||||||
|
|
||||||
<pss:ifAuthorized permission="archiva-manage-configuration">
|
<pss:ifAuthorized permission="archiva-manage-configuration">
|
||||||
<h5>Administration</h5>
|
<h5>Administration</h5>
|
||||||
<ul>
|
<ul>
|
||||||
<li class="none">
|
|
||||||
<my:currentWWUrl action="index" namespace="/admin">Settings</my:currentWWUrl>
|
|
||||||
</li>
|
|
||||||
<li class="none">
|
<li class="none">
|
||||||
<my:currentWWUrl action="repositories" namespace="/admin">Repositories</my:currentWWUrl>
|
<my:currentWWUrl action="repositories" namespace="/admin">Repositories</my:currentWWUrl>
|
||||||
</li>
|
</li>
|
||||||
<%--
|
|
||||||
<li class="none">
|
<li class="none">
|
||||||
<my:currentWWUrl action="proxiedRepositories" namespace="/admin">Proxied Repositories</my:currentWWUrl>
|
<my:currentWWUrl action="proxyConnectors" namespace="/admin">Proxy Connectors</my:currentWWUrl>
|
||||||
</li>
|
</li>
|
||||||
--%>
|
<li class="none">
|
||||||
|
<my:currentWWUrl action="networkProxies" namespace="/admin">Network Proxies</my:currentWWUrl>
|
||||||
<%-- TODO: add back after synced repos are implemented
|
</li>
|
||||||
<li class="none">
|
<li class="none">
|
||||||
<my:currentWWUrl action="syncedRepositories" namespace="/admin">Synced Repositories</my:currentWWUrl>
|
<my:currentWWUrl action="repositoryScanning" namespace="/admin">Repository Scanning</my:currentWWUrl>
|
||||||
</li>
|
</li>
|
||||||
--%>
|
<li class="none">
|
||||||
|
<my:currentWWUrl action="database" namespace="/admin">Database</my:currentWWUrl>
|
||||||
|
</li>
|
||||||
|
<%-- TODO: future options here.
|
||||||
|
* Repository Syncing Connectors. (rsync, ftp, scp, etc...)
|
||||||
|
* Web Services (enable / disable), role based?
|
||||||
|
--%>
|
||||||
</ul>
|
</ul>
|
||||||
</pss:ifAuthorized>
|
</pss:ifAuthorized>
|
||||||
|
|
||||||
|
|
|
@ -84,7 +84,6 @@ div.clear hr {
|
||||||
}
|
}
|
||||||
|
|
||||||
#leftColumn {
|
#leftColumn {
|
||||||
height: 315px;
|
|
||||||
width: 170px;
|
width: 170px;
|
||||||
float: left;
|
float: left;
|
||||||
overflow: auto;
|
overflow: auto;
|
||||||
|
|
|
@ -211,3 +211,77 @@ ul.dependencyTree span.artifact-link {
|
||||||
background-color: #F3B455 !important;
|
background-color: #F3B455 !important;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
div.repository h3 {
|
||||||
|
border-bottom: 0px !important;
|
||||||
|
padding-left: 15px !important;
|
||||||
|
}
|
||||||
|
|
||||||
|
div.repository {
|
||||||
|
border-bottom: 1px solid #DFDEDE;
|
||||||
|
}
|
||||||
|
|
||||||
|
tr.proxyConnector {
|
||||||
|
border-bottom: 1px solid #DFDEDE;
|
||||||
|
}
|
||||||
|
|
||||||
|
tr.proxyConnector td.managedRepo div,
|
||||||
|
tr.proxyConnector td.remoteRepo div {
|
||||||
|
border: 1px dotted gray;
|
||||||
|
padding: 5px;
|
||||||
|
background-color: white;
|
||||||
|
}
|
||||||
|
|
||||||
|
tr.proxyConnector td.managedRepo img,
|
||||||
|
tr.proxyConnector td.remoteRepo img {
|
||||||
|
float: left;
|
||||||
|
border: 0px;
|
||||||
|
}
|
||||||
|
|
||||||
|
tr.proxyConnector td.managedRepo div p,
|
||||||
|
tr.proxyConnector td.remoteRepo div p {
|
||||||
|
margin: 0px;
|
||||||
|
margin-left: 40px;
|
||||||
|
padding: 0px;
|
||||||
|
}
|
||||||
|
|
||||||
|
tr.proxyConnector td.managedRepo div p.id,
|
||||||
|
tr.proxyConnector td.remoteRepo div p.id {
|
||||||
|
font-family: monospace;
|
||||||
|
}
|
||||||
|
|
||||||
|
tr.proxyConnector td.connector {
|
||||||
|
padding-left: 10px;
|
||||||
|
padding-right: 10px;
|
||||||
|
}
|
||||||
|
|
||||||
|
tr.proxyConnector td.connector div.wrap {
|
||||||
|
margin-left: 10px;
|
||||||
|
margin-right: 10px;
|
||||||
|
padding: 5px;
|
||||||
|
border: 1px solid gray;
|
||||||
|
background-color: #eeeeee;
|
||||||
|
}
|
||||||
|
|
||||||
|
tr.proxyConnector td.connector div.controls {
|
||||||
|
float: right;
|
||||||
|
}
|
||||||
|
|
||||||
|
tr.proxyConnector td.connector div h4 {
|
||||||
|
font-size: 1.0em;
|
||||||
|
margin: 0px;
|
||||||
|
}
|
||||||
|
|
||||||
|
tr.proxyConnector td.connector table {
|
||||||
|
border: 0px;
|
||||||
|
background-color: transparent;
|
||||||
|
font-size: 0.8em;
|
||||||
|
}
|
||||||
|
|
||||||
|
tr.proxyConnector td.connector table p {
|
||||||
|
margin: 0px;
|
||||||
|
padding: 0px;
|
||||||
|
}
|
||||||
|
|
||||||
|
tr.seperator td {
|
||||||
|
border-top: 1px dashed #dddddd !important;
|
||||||
|
}
|
After Width: | Height: | Size: 1.3 KiB |
After Width: | Height: | Size: 1.9 KiB |
After Width: | Height: | Size: 237 B |
After Width: | Height: | Size: 231 B |
After Width: | Height: | Size: 228 B |
After Width: | Height: | Size: 230 B |
After Width: | Height: | Size: 255 B |
After Width: | Height: | Size: 236 B |
After Width: | Height: | Size: 351 B |
After Width: | Height: | Size: 246 B |
After Width: | Height: | Size: 300 B |
After Width: | Height: | Size: 281 B |
After Width: | Height: | Size: 344 B |